{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-b0865530ccf1e5ed", "name": "Privileged port 28 in use", "shortDescription": {"text": "Privileged port 28 in use"}, "fullDescription": {"text": "Port 28 is privileged (<1024). Make sure the service runs with the right caps or front it with a non-privileged port via a load balancer."}, "properties": {"scanner": "scanner-primary", "layer": "network", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a5823f1252b6cda1", "name": "Dockerfile runs as root: web/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: web/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-213dadc0ee5a5b00", "name": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1f66ad88286ca30a", "name": "Dockerfile runs as root: backend/Dockerfile", "shortDescription": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "fullDescription": {"text": "No non-root USER set. Containers running as root expand the blast radius of any vulnerability inside the image."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-714c31ca9f474ae6", "name": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim", "shortDescription": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "fullDescription": {"text": "Container tags can be retagged upstream. Pin production base images to a reviewed digest (`image@sha256:...`) when reproducibility and supply-chain integrity matter."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aa5acaa49eb8315b", "name": "Containers defined but no K8s/orchestration manifest found", "shortDescription": {"text": "Containers defined but no K8s/orchestration manifest found"}, "fullDescription": {"text": "Repo has Dockerfiles/compose but no Kubernetes/Nomad manifests. If the target deployment is K8s, the manifests may live in a separate ops repo."}, "properties": {"scanner": "scanner-primary", "layer": "hardware", "severity": "low", "confidence": 1.0}}, {"id": "scanner-395e631573c48116", "name": "Possible secret in backend/conftest.py", "shortDescription": {"text": "Possible secret in backend/conftest.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-ce98ebbab663b976", "name": "Possible secret in backend/apps/profiles/management/commands/seed_demo.py", "shortDescription": {"text": "Possible secret in backend/apps/profiles/management/commands/seed_demo.py"}, "fullDescription": {"text": "Detected pattern matching password_literal. Rotate the credential and move to a secret manager."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "critical", "confidence": 1.0}}, {"id": "scanner-28c4a04bd807da0c", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "appleboy/ssh-action@v1.0.3 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-5a086a90ed8617b0", "name": "Very large file: web/app/admin-panel/page.tsx (1741 lines)", "shortDescription": {"text": "Very large file: web/app/admin-panel/page.tsx (1741 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-b0bf3ee2d5e78372", "name": "Very large file: web/app/cabinet/page.tsx (2344 lines)", "shortDescription": {"text": "Very large file: web/app/cabinet/page.tsx (2344 lines)"}, "fullDescription": {"text": "Files with >800 lines often hide complexity hotspots and discourage tests."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea3b5e389d8c9c0f", "name": "Low test-to-source ratio", "shortDescription": {"text": "Low test-to-source ratio"}, "fullDescription": {"text": "40 tests / 254 src (ratio 0.16)."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-141b30a41e03817b", "name": "No license file detected", "shortDescription": {"text": "No license file detected"}, "fullDescription": {"text": "No LICENSE/COPYING/NOTICE file was found. Generated repositories often omit licensing, which blocks reuse and automated intake."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f61e9dc22135856f", "name": "Node manifest has dependencies but no lockfile: web/package.json", "shortDescription": {"text": "Node manifest has dependencies but no lockfile: web/package.json"}, "fullDescription": {"text": "`package.json` declares dependencies, but no same-directory npm/pnpm/yarn/bun lockfile was found. Generated projects without lockfiles are less reproducible and harder to secure-scan precisely."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-72b2a6250083a784", "name": "Placeholder or mock-heavy implementation detected", "shortDescription": {"text": "Placeholder or mock-heavy implementation detected"}, "fullDescription": {"text": "Found 115 placeholder/mock markers across 19 source files. This often means the repo looks complete while core flows still use generated scaffolding or fake data."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-2d0c7b7ab8f8aacf", "name": "Critical user flow still appears backed by mock or placeholder data", "shortDescription": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "fullDescription": {"text": "A payment/auth/admin/order/billing-style flow contains mock, fake, TODO, dummy, or placeholder markers in runtime source. In the Fable corpus this is a high-leverage completeness smell: the app can look finished while the money, identity, or tenant flow is still scaffolded."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b9088664ace7f748", "name": "Composite production-readiness gap", "shortDescription": {"text": "Composite production-readiness gap"}, "fullDescription": {"text": "Multiple low-cost hardening controls are missing together: license, lockfile. Opus verification showed these co-occurring gaps are a better readiness signal than reading each flag in isolation."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ea8f3013f588db25", "name": "Shallow git history limits provenance confidence", "shortDescription": {"text": "Shallow git history limits provenance confidence"}, "fullDescription": {"text": "The repository is a shallow clone. Origin/evolution analysis cannot distinguish fresh generation, imported legacy code, or long-lived human code with high confidence."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-8424db9c75e04ba4", "name": "Very short observed git history", "shortDescription": {"text": "Very short observed git history"}, "fullDescription": {"text": "The repo has multiple source files but two or fewer visible commits. This is not a failure by itself, but it lowers confidence in evolution-based diagnosis."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-4366bf2d973ddc8e", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/components/MessagesPanel.tsx:73", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/components/MessagesPanel.tsx:73"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-73024658339f5be8", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/components/FollowButton.tsx:31", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/components/FollowButton.tsx:31"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d9ec19bb74d812a0", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/teams/[id]/page.tsx:9", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/teams/[id]/page.tsx:9"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e46a398b4bec6f3f", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/guides/new/page.tsx:35", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/guides/new/page.tsx:35"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-745c67f099c1e3bd", "name": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/cabinet/page.tsx:343", "shortDescription": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/cabinet/page.tsx:343"}, "fullDescription": {"text": "Bare `fetch(...)` will throw an unhandled rejection on network failure. Wrap in try/catch, attach a `.catch(...)`, or pass an AbortSignal with a timeout."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fc8dce7b050f35c5", "name": "Legacy-named symbol `api_v1` in backend/config/urls.py:29", "shortDescription": {"text": "Legacy-named symbol `api_v1` in backend/config/urls.py:29"}, "fullDescription": {"text": "Names with suffixes like `_old`, `_v1`, `_deprecated` usually indicate replaced-but-not-removed code (typical AI-coder leftover). Confirm and delete, or rename if it's the active version."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-374bd85457eb7e57", "name": "Likely N+1 query: `for lk in \u2026` triggers a query per row \u2014 backend/common/feed.py:85", "shortDescription": {"text": "Likely N+1 query: `for lk in \u2026` triggers a query per row \u2014 backend/common/feed.py:85"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `lk.author.username` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d015eddc29a199b3", "name": "Likely N+1 query: `for ev in \u2026` triggers a query per row \u2014 backend/common/feed.py:104", "shortDescription": {"text": "Likely N+1 query: `for ev in \u2026` triggers a query per row \u2014 backend/common/feed.py:104"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `ev.cover.url` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-98dd40f7eacd2a43", "name": "Likely N+1 query: `for nw in \u2026` triggers a query per row \u2014 backend/common/feed.py:114", "shortDescription": {"text": "Likely N+1 query: `for nw in \u2026` triggers a query per row \u2014 backend/common/feed.py:114"}, "fullDescription": {"text": "The loop iterates a Django queryset and accesses `nw.image.url` per row, which fires an additional database query each iteration. Add `.select_related('<fk_field>')` for FK / O2O relations or `.prefetch_related('<m2m_or_reverse>')` for many-related lookups, to load everything in 1-2 queries instead of N."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4265a1ad3026ad4a", "name": "Commented-code block (5 lines) in backend/apps/billing/migrations/0003_remove_subscription_uniq_user_pro_and_more.py:1", "shortDescription": {"text": "Commented-code block (5 lines) in backend/apps/billing/migrations/0003_remove_subscription_uniq_user_pro_and_more.py:1"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-b2f0a476cb6de078", "name": "Commented-code block (5 lines) in backend/apps/messaging/views.py:38", "shortDescription": {"text": "Commented-code block (5 lines) in backend/apps/messaging/views.py:38"}, "fullDescription": {"text": "A long run of `//` or `#` lines usually means abandoned code. Delete or move to git history. Keeps the canvas + dead-code detection honest."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-250f57e8a1dbd3c5", "name": "4 env vars used in code but missing from .env.example", "shortDescription": {"text": "4 env vars used in code but missing from .env.example"}, "fullDescription": {"text": "Drift between code and config docs. The first few: `API_URL`, `EMAIL_BACKEND`, `INVITE_REQUIRED`, `NEXT_PUBLIC_API_URL`. Add them (with a placeholder/comment) to .env.example so onboarding doesn't break."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "info", "confidence": 1.0}}, {"id": "scanner-be46ea126aa5d8dc", "name": "Near-duplicate function bodies in 3 places", "shortDescription": {"text": "Near-duplicate function bodies in 3 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/common/views.py:get, backend/common/views.py:get, backend/common/views.py:get\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2c04133e54348533", "name": "Near-duplicate function bodies in 2 places", "shortDescription": {"text": "Near-duplicate function bodies in 2 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/common/views.py:score, backend/common/views.py:score\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46969939caf8120b", "name": "Near-duplicate function bodies in 9 places", "shortDescription": {"text": "Near-duplicate function bodies in 9 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/common/admin_content.py:get, backend/common/admin_content.py:get, backend/common/admin_content.py:get, backend/common/admin_content.py:get\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-02525d39071dd2c7", "name": "Near-duplicate function bodies in 5 places", "shortDescription": {"text": "Near-duplicate function bodies in 5 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/common/admin_content.py:delete, backend/common/admin_content.py:delete, backend/common/admin_content.py:delete, backend/common/admin_content.py:delete\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-0027e313ade46c8f", "name": "Near-duplicate function bodies in 7 places", "shortDescription": {"text": "Near-duplicate function bodies in 7 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/common/admin_content.py:post, backend/common/admin_content.py:post, backend/common/admin_content.py:post, backend/common/admin_content.py:post\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-49c98f7cedd9c977", "name": "Near-duplicate function bodies in 4 places", "shortDescription": {"text": "Near-duplicate function bodies in 4 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/common/admin_content.py:patch, backend/common/admin_content.py:patch, backend/common/admin_content.py:patch, backend/common/admin_content.py:patch\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-76a2f6818267a9a8", "name": "Near-duplicate function bodies in 8 places", "shortDescription": {"text": "Near-duplicate function bodies in 8 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/common/admin_panel.py:post, backend/common/admin_panel.py:post, backend/common/admin_panel.py:post, backend/common/admin_panel.py:post\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-122053f21232d80c", "name": "Near-duplicate function bodies in 14 places", "shortDescription": {"text": "Near-duplicate function bodies in 14 places"}, "fullDescription": {"text": "Functions with the same first-5-line body hash:\nbackend/apps/users/views.py:post, backend/apps/users/views.py:post, backend/apps/users/views.py:post, backend/apps/users/views.py:post\n\nThis is *the* AI-coder failure mode (4\u00d7 more duplication in vibe-coded repos \u2014 see https://jw.hn/ai-code-hygiene). Consolidate or document why they're separate."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ec57f1296f1bc06", "name": "Django CBV `AdminSubscriptionsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_billing.py:47", "shortDescription": {"text": "Django CBV `AdminSubscriptionsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_billing.py:47"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-ee2a9cbc217b2939", "name": "Django CBV `AdminSubscriptionUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_billing.py:113", "shortDescription": {"text": "Django CBV `AdminSubscriptionUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_billing.py:113"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d100d8b069a0554c", "name": "Django CBV `AdminStatsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:30", "shortDescription": {"text": "Django CBV `AdminStatsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:30"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-896973906dba4e5a", "name": "Django CBV `AdminWorkshopsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:54", "shortDescription": {"text": "Django CBV `AdminWorkshopsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:54"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6616e717e72ed8fc", "name": "Django CBV `AdminWorkshopDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:80", "shortDescription": {"text": "Django CBV `AdminWorkshopDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:80"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6bc57842a5655061", "name": "Django CBV `AdminUserWorkshopsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:91", "shortDescription": {"text": "Django CBV `AdminUserWorkshopsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:91"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-47c5d1443a61fb9c", "name": "Django CBV `AdminWorkshopUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:111", "shortDescription": {"text": "Django CBV `AdminWorkshopUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:111"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-871531828cdab09d", "name": "Django CBV `AdminListingsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:124", "shortDescription": {"text": "Django CBV `AdminListingsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:124"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6a6b7095164a3330", "name": "Django CBV `AdminListingActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:154", "shortDescription": {"text": "Django CBV `AdminListingActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:154"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-642539642185708e", "name": "Django CBV `AdminListingUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:166", "shortDescription": {"text": "Django CBV `AdminListingUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:166"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-59b4979160e9acec", "name": "Django CBV `AdminListingDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:194", "shortDescription": {"text": "Django CBV `AdminListingDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:194"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-4893f1960b0ec663", "name": "Django CBV `AdminProductsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:205", "shortDescription": {"text": "Django CBV `AdminProductsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:205"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6c5fe89983fa5961", "name": "Django CBV `AdminProductActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:227", "shortDescription": {"text": "Django CBV `AdminProductActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:227"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-b6ccb219fafdbf88", "name": "Django CBV `AdminProductDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:239", "shortDescription": {"text": "Django CBV `AdminProductDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:239"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6186d02641193475", "name": "Django CBV `AdminUserProductsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:250", "shortDescription": {"text": "Django CBV `AdminUserProductsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:250"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-37092f30f88f4826", "name": "Django CBV `AdminProductUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:270", "shortDescription": {"text": "Django CBV `AdminProductUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:270"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e45f4b411c0082b1", "name": "Django CBV `AdminUserSlotsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:283", "shortDescription": {"text": "Django CBV `AdminUserSlotsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:283"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6fa888224807e3da", "name": "Django CBV `AdminSlotUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:303", "shortDescription": {"text": "Django CBV `AdminSlotUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:303"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e880fbfbf2e10a19", "name": "Django CBV `AdminUserPhotosView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:326", "shortDescription": {"text": "Django CBV `AdminUserPhotosView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:326"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-dee3c09f2ecb7fa9", "name": "Django CBV `AdminUserPhotoDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:368", "shortDescription": {"text": "Django CBV `AdminUserPhotoDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:368"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-d3421d424328d961", "name": "Django CBV `AdminOrdersView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:379", "shortDescription": {"text": "Django CBV `AdminOrdersView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:379"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-7f685257c7237316", "name": "Django CBV `AdminOrderStatusView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:403", "shortDescription": {"text": "Django CBV `AdminOrderStatusView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:403"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-fed9eae162ad2186", "name": "Django CBV `AdminUsersView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:45", "shortDescription": {"text": "Django CBV `AdminUsersView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:45"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-6ea5b781f5dbe7bb", "name": "Django CBV `AdminUserRolesView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:114", "shortDescription": {"text": "Django CBV `AdminUserRolesView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:114"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-725906fd449f5d58", "name": "Django CBV `AdminUserStaffView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:136", "shortDescription": {"text": "Django CBV `AdminUserStaffView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:136"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-015ad905bb8e8d44", "name": "Django CBV `AdminUserActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:151", "shortDescription": {"text": "Django CBV `AdminUserActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:151"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-82ae940dab800961", "name": "Django CBV `AdminUserDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:166", "shortDescription": {"text": "Django CBV `AdminUserDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:166"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-a5133081f6d24b20", "name": "Django CBV `AdminUserSubsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:196", "shortDescription": {"text": "Django CBV `AdminUserSubsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:196"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-e1cbcef17c5a2ac8", "name": "Django CBV `AdminUserSubDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:227", "shortDescription": {"text": "Django CBV `AdminUserSubDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:227"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-8296f1480fcc3fa6", "name": "Django CBV `AdminInvitesView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:255", "shortDescription": {"text": "Django CBV `AdminInvitesView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:255"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-05c8d2b688f78cbc", "name": "Django CBV `AdminInviteUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:273", "shortDescription": {"text": "Django CBV `AdminInviteUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:273"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-360a04165c21ac68", "name": "Django CBV `MeView` lacks `LoginRequiredMixin` \u2014 backend/apps/users/views.py:125", "shortDescription": {"text": "Django CBV `MeView` lacks `LoginRequiredMixin` \u2014 backend/apps/users/views.py:125"}, "fullDescription": {"text": "Class-based view defines mutating methods (post/put/delete) without inheriting `LoginRequiredMixin`. If auth is enforced via `dispatch()` override or middleware, dismiss this finding."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-c490514582048920", "name": "DRF view `EventViewSet` declares no `permission_classes` \u2014 backend/apps/events/views.py:11", "shortDescription": {"text": "DRF view `EventViewSet` declares no `permission_classes` \u2014 backend/apps/events/views.py:11"}, "fullDescription": {"text": "DRF defaults to AllowAny when `permission_classes` is unset, exposing the endpoint publicly. Add `permission_classes = [IsAuthenticated]` (or stricter) at class level, or set `DEFAULT_PERMISSION_CLASSES` in settings."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2f81a8db35db77e8", "name": "DRF view `NewsViewSet` declares no `permission_classes` \u2014 backend/apps/news/views.py:9", "shortDescription": {"text": "DRF view `NewsViewSet` declares no `permission_classes` \u2014 backend/apps/news/views.py:9"}, "fullDescription": {"text": "DRF defaults to AllowAny when `permission_classes` is unset, exposing the endpoint publicly. Add `permission_classes = [IsAuthenticated]` (or stricter) at class level, or set `DEFAULT_PERMISSION_CLASSES` in settings."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5efa175258451b84", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/notifications/page.tsx:33)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/notifications/page.tsx:33)"}, "fullDescription": {"text": "`web/app/notifications/page.tsx:33` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9387aba77d65e3c5", "name": "Dangling fetch: GET /api/v1/notifications/ (web/app/notifications/page.tsx:40)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/notifications/ (web/app/notifications/page.tsx:40)"}, "fullDescription": {"text": "`web/app/notifications/page.tsx:40` calls `GET /api/v1/notifications/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/notifications`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2672a081551a1881", "name": "Dangling fetch: POST /api/v1/notifications/mark-read/ (web/app/notifications/page.tsx:45)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/notifications/mark-read/ (web/app/notifications/page.tsx:45)"}, "fullDescription": {"text": "`web/app/notifications/page.tsx:45` calls `POST /api/v1/notifications/mark-read/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/notifications/mark-read`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8233128b1fe34bf5", "name": "Dangling fetch: POST /api/v1/auth/login/ (web/app/auth/login/page.tsx:29)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/login/ (web/app/auth/login/page.tsx:29)"}, "fullDescription": {"text": "`web/app/auth/login/page.tsx:29` calls `POST /api/v1/auth/login/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/login`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-538c42b0213472ce", "name": "Dangling fetch: POST /api/v1/auth/forgot-password/ (web/app/auth/forgot-password/page.tsx:28)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/forgot-password/ (web/app/auth/forgot-password/page.tsx:28)"}, "fullDescription": {"text": "`web/app/auth/forgot-password/page.tsx:28` calls `POST /api/v1/auth/forgot-password/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/forgot-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8e7fcd8f6e5280d2", "name": "Dangling fetch: POST /api/v1/auth/reset-password/ (web/app/auth/forgot-password/page.tsx:82)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/reset-password/ (web/app/auth/forgot-password/page.tsx:82)"}, "fullDescription": {"text": "`web/app/auth/forgot-password/page.tsx:82` calls `POST /api/v1/auth/reset-password/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/reset-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0b304ded672e48f1", "name": "Dangling fetch: POST /api/v1/auth/verify-otp/ (web/app/auth/verify-email/page.tsx:50)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/verify-otp/ (web/app/auth/verify-email/page.tsx:50)"}, "fullDescription": {"text": "`web/app/auth/verify-email/page.tsx:50` calls `POST /api/v1/auth/verify-otp/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/verify-otp`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1efa21132b6aed97", "name": "Dangling fetch: POST /api/v1/auth/send-otp/ (web/app/auth/verify-email/page.tsx:74)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/send-otp/ (web/app/auth/verify-email/page.tsx:74)"}, "fullDescription": {"text": "`web/app/auth/verify-email/page.tsx:74` calls `POST /api/v1/auth/send-otp/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/send-otp`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6234e314ff2f8d31", "name": "Dangling fetch: POST /api/v1/auth/verify-telegram-otp/ (web/app/auth/verify-phone/page.tsx:20)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/verify-telegram-otp/ (web/app/auth/verify-phone/page.tsx:20)"}, "fullDescription": {"text": "`web/app/auth/verify-phone/page.tsx:20` calls `POST /api/v1/auth/verify-telegram-otp/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/verify-telegram-otp`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-752c2ae7d0b45c5c", "name": "Dangling fetch: GET /api/v1/slots/?owner=${ownerId} (web/app/components/SlotList.tsx:33)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/slots/?owner=${ownerId} (web/app/components/SlotList.tsx:33)"}, "fullDescription": {"text": "`web/app/components/SlotList.tsx:33` calls `GET /api/v1/slots/?owner=${ownerId}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/slots`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-145584d9661f3a9c", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SlotList.tsx:38)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SlotList.tsx:38)"}, "fullDescription": {"text": "`web/app/components/SlotList.tsx:38` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-daddc0ffc6625825", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SlotList.tsx:47)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SlotList.tsx:47)"}, "fullDescription": {"text": "`web/app/components/SlotList.tsx:47` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f1fb21897415f32a", "name": "Dangling fetch: POST /api/v1/slots/${slot.id}/book/ (web/app/components/SlotList.tsx:49)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/slots/${slot.id}/book/ (web/app/components/SlotList.tsx:49)"}, "fullDescription": {"text": "`web/app/components/SlotList.tsx:49` calls `POST /api/v1/slots/${slot.id}/book/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/slots/<p>/book`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e79dffb48c6ece8e", "name": "Dangling fetch: DELETE /api/v1/slots/${slot.id}/book/ (web/app/components/SlotList.tsx:64)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/slots/${slot.id}/book/ (web/app/components/SlotList.tsx:64)"}, "fullDescription": {"text": "`web/app/components/SlotList.tsx:64` calls `DELETE /api/v1/slots/${slot.id}/book/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/slots/<p>/book`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-adbf87fcf8bfbc56", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/OrderButton.tsx:26)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/OrderButton.tsx:26)"}, "fullDescription": {"text": "`web/app/components/OrderButton.tsx:26` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-634cabae769da736", "name": "Dangling fetch: POST /api/v1/orders/ (web/app/components/OrderButton.tsx:38)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/orders/ (web/app/components/OrderButton.tsx:38)"}, "fullDescription": {"text": "`web/app/components/OrderButton.tsx:38` calls `POST /api/v1/orders/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/orders`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8b99f64b67d5fde1", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/OwnerOnly.tsx:21)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/OwnerOnly.tsx:21)"}, "fullDescription": {"text": "`web/app/components/OwnerOnly.tsx:21` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bcb8539ae7dd52f2", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/AuthNav.tsx:16)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/AuthNav.tsx:16)"}, "fullDescription": {"text": "`web/app/components/AuthNav.tsx:16` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-615c0e18b5638009", "name": "Dangling fetch: GET /api/v1/messages/unread-count/ (web/app/components/AuthNav.tsx:31)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/messages/unread-count/ (web/app/components/AuthNav.tsx:31)"}, "fullDescription": {"text": "`web/app/components/AuthNav.tsx:31` calls `GET /api/v1/messages/unread-count/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/messages/unread-count`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-2c1a2c75507e837f", "name": "Dangling fetch: GET /api/v1/notifications/unread-count/ (web/app/components/AuthNav.tsx:32)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/notifications/unread-count/ (web/app/components/AuthNav.tsx:32)"}, "fullDescription": {"text": "`web/app/components/AuthNav.tsx:32` calls `GET /api/v1/notifications/unread-count/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/notifications/unread-count`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-05de970eb02c4ea5", "name": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/components/AuthNav.tsx:44)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/components/AuthNav.tsx:44)"}, "fullDescription": {"text": "`web/app/components/AuthNav.tsx:44` calls `POST /api/v1/auth/logout/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/logout`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b77bdaca698b23c0", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/LikeButton.tsx:19)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/LikeButton.tsx:19)"}, "fullDescription": {"text": "`web/app/components/LikeButton.tsx:19` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9d760d7c78b79b7e", "name": "Dangling fetch: GET /api/v1/looks/${lookId}/like/ (web/app/components/LikeButton.tsx:21)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/looks/${lookId}/like/ (web/app/components/LikeButton.tsx:21)"}, "fullDescription": {"text": "`web/app/components/LikeButton.tsx:21` calls `GET /api/v1/looks/${lookId}/like/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/looks/<p>/like`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-622c94ccbd468304", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MessagesPanel.tsx:52)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MessagesPanel.tsx:52)"}, "fullDescription": {"text": "`web/app/components/MessagesPanel.tsx:52` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-94986c780fd4d39a", "name": "Dangling fetch: GET /api/v1/conversations/ (web/app/components/MessagesPanel.tsx:59)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/conversations/ (web/app/components/MessagesPanel.tsx:59)"}, "fullDescription": {"text": "`web/app/components/MessagesPanel.tsx:59` calls `GET /api/v1/conversations/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/conversations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4cc22735f4df0e0a", "name": "Dangling fetch: POST /api/v1/conversations/ (web/app/components/MessagesPanel.tsx:73)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/conversations/ (web/app/components/MessagesPanel.tsx:73)"}, "fullDescription": {"text": "`web/app/components/MessagesPanel.tsx:73` calls `POST /api/v1/conversations/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/conversations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-69b3b237efcdf777", "name": "Dangling fetch: GET /api/v1/conversations/${activeId}/messages/ (web/app/components/MessagesPanel.tsx:100)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/conversations/${activeId}/messages/ (web/app/components/MessagesPanel.tsx:100)"}, "fullDescription": {"text": "`web/app/components/MessagesPanel.tsx:100` calls `GET /api/v1/conversations/${activeId}/messages/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/conversations/<p>/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b043ddd5193d6b33", "name": "Dangling fetch: POST /api/v1/conversations/${activeId}/messages/ (web/app/components/MessagesPanel.tsx:121)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/conversations/${activeId}/messages/ (web/app/components/MessagesPanel.tsx:121)"}, "fullDescription": {"text": "`web/app/components/MessagesPanel.tsx:121` calls `POST /api/v1/conversations/${activeId}/messages/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/conversations/<p>/messages`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-fd00f1e62c6b11a5", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MobileMenu.tsx:49)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MobileMenu.tsx:49)"}, "fullDescription": {"text": "`web/app/components/MobileMenu.tsx:49` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e6465d0688054a1a", "name": "Dangling fetch: GET /api/v1/messages/unread-count/ (web/app/components/MobileMenu.tsx:55)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/messages/unread-count/ (web/app/components/MobileMenu.tsx:55)"}, "fullDescription": {"text": "`web/app/components/MobileMenu.tsx:55` calls `GET /api/v1/messages/unread-count/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/messages/unread-count`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7d73a5b657c04b15", "name": "Dangling fetch: GET /api/v1/notifications/unread-count/ (web/app/components/MobileMenu.tsx:57)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/notifications/unread-count/ (web/app/components/MobileMenu.tsx:57)"}, "fullDescription": {"text": "`web/app/components/MobileMenu.tsx:57` calls `GET /api/v1/notifications/unread-count/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/notifications/unread-count`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ddf666599417d533", "name": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/components/MobileMenu.tsx:81)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/components/MobileMenu.tsx:81)"}, "fullDescription": {"text": "`web/app/components/MobileMenu.tsx:81` calls `POST /api/v1/auth/logout/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/logout`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9feacb85371057fe", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/GatedButton.tsx:23)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/GatedButton.tsx:23)"}, "fullDescription": {"text": "`web/app/components/GatedButton.tsx:23` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ad674ec6124fd44f", "name": "Dangling fetch: GET /api/v1/search/?q=${encodeURIComponent(term)} (web/app/components/SearchBox.tsx:50)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/search/?q=${encodeURIComponent(term)} (web/app/components/SearchBox.tsx:50)"}, "fullDescription": {"text": "`web/app/components/SearchBox.tsx:50` calls `GET /api/v1/search/?q=${encodeURIComponent(term)}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/search`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a94fbe8b5da53448", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/GoingButton.tsx:25)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/GoingButton.tsx:25)"}, "fullDescription": {"text": "`web/app/components/GoingButton.tsx:25` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4b0df64ee997a836", "name": "Dangling fetch: GET /api/v1/events/${eventId}/attend/ (web/app/components/GoingButton.tsx:27)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/events/${eventId}/attend/ (web/app/components/GoingButton.tsx:27)"}, "fullDescription": {"text": "`web/app/components/GoingButton.tsx:27` calls `GET /api/v1/events/${eventId}/attend/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/events/<p>/attend`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8fc2494f0d5f24ca", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MarketListings.tsx:19)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MarketListings.tsx:19)"}, "fullDescription": {"text": "`web/app/components/MarketListings.tsx:19` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9e019f1653793e2a", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/PostListingButton.tsx:23)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/PostListingButton.tsx:23)"}, "fullDescription": {"text": "`web/app/components/PostListingButton.tsx:23` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-19ae866ea91851d9", "name": "Dangling fetch: GET /api/v1/favorites/${kind}/${objectId}/ (web/app/components/SaveButton.tsx:27)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/favorites/${kind}/${objectId}/ (web/app/components/SaveButton.tsx:27)"}, "fullDescription": {"text": "`web/app/components/SaveButton.tsx:27` calls `GET /api/v1/favorites/${kind}/${objectId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/favorites/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-752c773c348f5195", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SaveButton.tsx:45)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SaveButton.tsx:45)"}, "fullDescription": {"text": "`web/app/components/SaveButton.tsx:45` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-abbc8a1a37b451ba", "name": "Dangling fetch: GET /api/v1/favorites/${kind}/${objectId}/ (web/app/components/SaveButton.tsx:50)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/favorites/${kind}/${objectId}/ (web/app/components/SaveButton.tsx:50)"}, "fullDescription": {"text": "`web/app/components/SaveButton.tsx:50` calls `GET /api/v1/favorites/${kind}/${objectId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/favorites/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4082cd527d91e944", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/JobListings.tsx:18)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/JobListings.tsx:18)"}, "fullDescription": {"text": "`web/app/components/JobListings.tsx:18` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1442a2f3ad1446a7", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MessageButton.tsx:23)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MessageButton.tsx:23)"}, "fullDescription": {"text": "`web/app/components/MessageButton.tsx:23` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ff7435fe1d9c1d5", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/FollowButton.tsx:26)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/FollowButton.tsx:26)"}, "fullDescription": {"text": "`web/app/components/FollowButton.tsx:26` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-53a30d13165dc9d6", "name": "Dangling fetch: GET /api/v1/follow/${userId}/ (web/app/components/FollowButton.tsx:31)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/follow/${userId}/ (web/app/components/FollowButton.tsx:31)"}, "fullDescription": {"text": "`web/app/components/FollowButton.tsx:31` calls `GET /api/v1/follow/${userId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/follow/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-296a6c48d844bd0f", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/FollowButton.tsx:49)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/FollowButton.tsx:49)"}, "fullDescription": {"text": "`web/app/components/FollowButton.tsx:49` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-20fff61f44996db3", "name": "Dangling fetch: GET /api/v1/follow/${userId}/ (web/app/components/FollowButton.tsx:54)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/follow/${userId}/ (web/app/components/FollowButton.tsx:54)"}, "fullDescription": {"text": "`web/app/components/FollowButton.tsx:54` calls `GET /api/v1/follow/${userId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/follow/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8418f6b194554744", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/ProCta.tsx:28)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/ProCta.tsx:28)"}, "fullDescription": {"text": "`web/app/components/ProCta.tsx:28` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b7bb3f7e742cd011", "name": "Dangling fetch: POST /api/v1/billing/activate/ (web/app/components/ProCta.tsx:38)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/billing/activate/ (web/app/components/ProCta.tsx:38)"}, "fullDescription": {"text": "`web/app/components/ProCta.tsx:38` calls `POST /api/v1/billing/activate/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/billing/activate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1d208f04643b9055", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/teams/new/page.tsx:15)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/teams/new/page.tsx:15)"}, "fullDescription": {"text": "`web/app/teams/new/page.tsx:15` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-587a4a61f06e1a80", "name": "Dangling fetch: POST /api/v1/teams/ (web/app/teams/new/page.tsx:30)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/teams/ (web/app/teams/new/page.tsx:30)"}, "fullDescription": {"text": "`web/app/teams/new/page.tsx:30` calls `POST /api/v1/teams/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/teams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f8074b3157c02027", "name": "Dangling fetch: GET /api/v1${path} (web/app/teams/[id]/page.tsx:9)", "shortDescription": {"text": "Dangling fetch: GET /api/v1${path} (web/app/teams/[id]/page.tsx:9)"}, "fullDescription": {"text": "`web/app/teams/[id]/page.tsx:9` calls `GET /api/v1${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b4944649463dc6d3", "name": "Dangling fetch: GET /api/v1/feed/ (web/app/feed/page.tsx:28)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/feed/ (web/app/feed/page.tsx:28)"}, "fullDescription": {"text": "`web/app/feed/page.tsx:28` calls `GET /api/v1/feed/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/feed`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b742703c3ab218e4", "name": "Dangling fetch: GET /api/v1${path} (web/app/admin-panel/page.tsx:53)", "shortDescription": {"text": "Dangling fetch: GET /api/v1${path} (web/app/admin-panel/page.tsx:53)"}, "fullDescription": {"text": "`web/app/admin-panel/page.tsx:53` calls `GET /api/v1${path}` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-aa4340448a5e8105", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/guides/new/page.tsx:15)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/guides/new/page.tsx:15)"}, "fullDescription": {"text": "`web/app/guides/new/page.tsx:15` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ecec06a75501eeb1", "name": "Dangling fetch: POST /api/v1/guides/ (web/app/guides/new/page.tsx:28)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/guides/ (web/app/guides/new/page.tsx:28)"}, "fullDescription": {"text": "`web/app/guides/new/page.tsx:28` calls `POST /api/v1/guides/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/guides`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-bcac8dac299e5530", "name": "Dangling fetch: POST /api/v1/guides/${data.id}/photos/ (web/app/guides/new/page.tsx:35)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/guides/${data.id}/photos/ (web/app/guides/new/page.tsx:35)"}, "fullDescription": {"text": "`web/app/guides/new/page.tsx:35` calls `POST /api/v1/guides/${data.id}/photos/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/guides/<p>/photos`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8241a406578a362b", "name": "Dangling fetch: GET /api/v1/conversations/ (web/app/cabinet/page.tsx:192)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/conversations/ (web/app/cabinet/page.tsx:192)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:192` calls `GET /api/v1/conversations/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/conversations`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-798d9e418171356d", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/cabinet/page.tsx:203)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/cabinet/page.tsx:203)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:203` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-46b547d0190c84eb", "name": "Dangling fetch: GET /api/v1/orders/ (web/app/cabinet/page.tsx:232)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/orders/ (web/app/cabinet/page.tsx:232)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:232` calls `GET /api/v1/orders/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/orders`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-29abd0aad573cfc7", "name": "Dangling fetch: GET /api/v1/events/mine/ (web/app/cabinet/page.tsx:240)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/events/mine/ (web/app/cabinet/page.tsx:240)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:240` calls `GET /api/v1/events/mine/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/events/mine`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-33e9dfd16e9290fa", "name": "Dangling fetch: GET /api/v1/analytics/me/ (web/app/cabinet/page.tsx:244)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/analytics/me/ (web/app/cabinet/page.tsx:244)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:244` calls `GET /api/v1/analytics/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/analytics/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3578c4f757d53c90", "name": "Dangling fetch: GET /api/v1/orders/incoming/ (web/app/cabinet/page.tsx:248)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/orders/incoming/ (web/app/cabinet/page.tsx:248)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:248` calls `GET /api/v1/orders/incoming/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/orders/incoming`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8f38da5defee44b6", "name": "Dangling fetch: GET /api/v1/listings/ (web/app/cabinet/page.tsx:255)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/listings/ (web/app/cabinet/page.tsx:255)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:255` calls `GET /api/v1/listings/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/listings`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3a8705f4a1c5806b", "name": "Dangling fetch: GET /api/v1/follow/following/ (web/app/cabinet/page.tsx:263)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/follow/following/ (web/app/cabinet/page.tsx:263)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:263` calls `GET /api/v1/follow/following/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/follow/following`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-e13120a300be1964", "name": "Dangling fetch: GET /api/v1/follow/followers/ (web/app/cabinet/page.tsx:267)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/follow/followers/ (web/app/cabinet/page.tsx:267)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:267` calls `GET /api/v1/follow/followers/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/follow/followers`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-8bf687d79a8a5aea", "name": "Dangling fetch: GET /api/v1/favorites/ (web/app/cabinet/page.tsx:271)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/favorites/ (web/app/cabinet/page.tsx:271)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:271` calls `GET /api/v1/favorites/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/favorites`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1da98672115c38a6", "name": "Dangling fetch: GET /api/v1/profiles/me/photos/ (web/app/cabinet/page.tsx:275)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/profiles/me/photos/ (web/app/cabinet/page.tsx:275)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:275` calls `GET /api/v1/profiles/me/photos/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/profiles/me/photos`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c71c00baf1e67a3c", "name": "Dangling fetch: GET /api/v1/looks/?mine=1 (web/app/cabinet/page.tsx:279)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/looks/?mine=1 (web/app/cabinet/page.tsx:279)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:279` calls `GET /api/v1/looks/?mine=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/looks`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-613aa3f2ca2eab34", "name": "Dangling fetch: GET /api/v1/products/?mine=1 (web/app/cabinet/page.tsx:287)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/products/?mine=1 (web/app/cabinet/page.tsx:287)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:287` calls `GET /api/v1/products/?mine=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/products`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1315d240629c3556", "name": "Dangling fetch: GET /api/v1/slots/?mine=1 (web/app/cabinet/page.tsx:295)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/slots/?mine=1 (web/app/cabinet/page.tsx:295)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:295` calls `GET /api/v1/slots/?mine=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/slots`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d1c0b271d316bf8c", "name": "Dangling fetch: GET /api/v1/teams/?mine=1 (web/app/cabinet/page.tsx:303)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/teams/?mine=1 (web/app/cabinet/page.tsx:303)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:303` calls `GET /api/v1/teams/?mine=1` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/teams`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-07851dd047184aa0", "name": "Dangling fetch: GET /api/v1/workshops/mine/ (web/app/cabinet/page.tsx:311)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/workshops/mine/ (web/app/cabinet/page.tsx:311)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:311` calls `GET /api/v1/workshops/mine/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/workshops/mine`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-10dfc1c7445d634e", "name": "Dangling fetch: GET /api/v1/billing/me/ (web/app/cabinet/page.tsx:319)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/billing/me/ (web/app/cabinet/page.tsx:319)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:319` calls `GET /api/v1/billing/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/billing/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a4885137cda65c5", "name": "Dangling fetch: POST /api/v1/billing/activate/ (web/app/cabinet/page.tsx:337)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/billing/activate/ (web/app/cabinet/page.tsx:337)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:337` calls `POST /api/v1/billing/activate/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/billing/activate`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-03a4ca2d5e0f17cd", "name": "Dangling fetch: GET /api/v1/billing/me/ (web/app/cabinet/page.tsx:343)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/billing/me/ (web/app/cabinet/page.tsx:343)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:343` calls `GET /api/v1/billing/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/billing/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-6c60c1eae5da7763", "name": "Dangling fetch: GET /api/v1/auth/me/ (web/app/cabinet/page.tsx:344)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/cabinet/page.tsx:344)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:344` calls `GET /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5b871328ed50d5dc", "name": "Dangling fetch: GET /api/v1/workshops/mine/ (web/app/cabinet/page.tsx:349)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/workshops/mine/ (web/app/cabinet/page.tsx:349)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:349` calls `GET /api/v1/workshops/mine/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/workshops/mine`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-51eaa5e20347c608", "name": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:376)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:376)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:376` calls `PATCH /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59c9c2c249004e4e", "name": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:393)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:393)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:393` calls `PATCH /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a1919416feef2079", "name": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:409)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:409)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:409` calls `PATCH /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-5aac6b3973e35788", "name": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:426)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:426)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:426` calls `PATCH /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-655caa3458169bca", "name": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:438)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:438)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:438` calls `PATCH /api/v1/auth/me/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/me`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-01b169552d002d40", "name": "Dangling fetch: POST /api/v1/orders/${orderId}/review/ (web/app/cabinet/page.tsx:447)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/orders/${orderId}/review/ (web/app/cabinet/page.tsx:447)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:447` calls `POST /api/v1/orders/${orderId}/review/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/orders/<p>/review`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-0b5a6809af8b2ed7", "name": "Dangling fetch: PATCH /api/v1/orders/incoming/${orderId}/ (web/app/cabinet/page.tsx:460)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/orders/incoming/${orderId}/ (web/app/cabinet/page.tsx:460)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:460` calls `PATCH /api/v1/orders/incoming/${orderId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/orders/incoming/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1c1b717341d59454", "name": "Dangling fetch: PATCH /api/v1/listings/${id}/ (web/app/cabinet/page.tsx:520)", "shortDescription": {"text": "Dangling fetch: PATCH /api/v1/listings/${id}/ (web/app/cabinet/page.tsx:520)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:520` calls `PATCH /api/v1/listings/${id}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/listings/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-59e10ed1bcdd0fb2", "name": "Dangling fetch: POST /api/v1/auth/${kind}/ (web/app/cabinet/page.tsx:535)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/${kind}/ (web/app/cabinet/page.tsx:535)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:535` calls `POST /api/v1/auth/${kind}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-d4320e278d5ecacd", "name": "Dangling fetch: DELETE /api/v1/auth/${kind}/ (web/app/cabinet/page.tsx:551)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/auth/${kind}/ (web/app/cabinet/page.tsx:551)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:551` calls `DELETE /api/v1/auth/${kind}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-864e4de21b2cbbc5", "name": "Dangling fetch: DELETE /api/v1/listings/${id}/ (web/app/cabinet/page.tsx:560)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/listings/${id}/ (web/app/cabinet/page.tsx:560)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:560` calls `DELETE /api/v1/listings/${id}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/listings/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-b9bb87c3fcd4289a", "name": "Dangling fetch: GET /api/v1/listings/public/ (web/app/cabinet/page.tsx:568)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/listings/public/ (web/app/cabinet/page.tsx:568)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:568` calls `GET /api/v1/listings/public/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/listings/public`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-9498ce2ea1aa3838", "name": "Dangling fetch: POST /api/v1/profiles/me/photos/ (web/app/cabinet/page.tsx:584)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/profiles/me/photos/ (web/app/cabinet/page.tsx:584)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:584` calls `POST /api/v1/profiles/me/photos/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/profiles/me/photos`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f47da4bfcc4eb1bd", "name": "Dangling fetch: DELETE /api/v1/profiles/me/photos/${id}/ (web/app/cabinet/page.tsx:592)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/profiles/me/photos/${id}/ (web/app/cabinet/page.tsx:592)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:592` calls `DELETE /api/v1/profiles/me/photos/${id}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/profiles/me/photos/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ca330bea7218f9db", "name": "Dangling fetch: POST /api/v1/looks/ (web/app/cabinet/page.tsx:608)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/looks/ (web/app/cabinet/page.tsx:608)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:608` calls `POST /api/v1/looks/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/looks`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ce21b4c7358b57b3", "name": "Dangling fetch: DELETE /api/v1/looks/${id}/ (web/app/cabinet/page.tsx:616)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/looks/${id}/ (web/app/cabinet/page.tsx:616)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:616` calls `DELETE /api/v1/looks/${id}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/looks/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c1ed045523f0df49", "name": "Dangling fetch: POST /api/v1/products/ (web/app/cabinet/page.tsx:633)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/products/ (web/app/cabinet/page.tsx:633)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:633` calls `POST /api/v1/products/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/products`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c4cc53d70e763539", "name": "Dangling fetch: DELETE /api/v1/products/${id}/ (web/app/cabinet/page.tsx:644)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/products/${id}/ (web/app/cabinet/page.tsx:644)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:644` calls `DELETE /api/v1/products/${id}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/products/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-7b4dd0d4fe6eef32", "name": "Dangling fetch: POST /api/v1/slots/ (web/app/cabinet/page.tsx:659)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/slots/ (web/app/cabinet/page.tsx:659)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:659` calls `POST /api/v1/slots/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/slots`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-803788a54c59d91f", "name": "Dangling fetch: DELETE /api/v1/slots/${id}/ (web/app/cabinet/page.tsx:673)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/slots/${id}/ (web/app/cabinet/page.tsx:673)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:673` calls `DELETE /api/v1/slots/${id}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/slots/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-c496d17c8f85d615", "name": "Dangling fetch: POST /api/v1/bookings/${bookingId}/ (web/app/cabinet/page.tsx:679)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/bookings/${bookingId}/ (web/app/cabinet/page.tsx:679)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:679` calls `POST /api/v1/bookings/${bookingId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/bookings/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-4ac4ac8250fb6462", "name": "Dangling fetch: POST /api/v1/workshops/ (web/app/cabinet/page.tsx:701)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/workshops/ (web/app/cabinet/page.tsx:701)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:701` calls `POST /api/v1/workshops/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/workshops`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-ff7cf190889f97ad", "name": "Dangling fetch: DELETE /api/v1/workshops/${id}/ (web/app/cabinet/page.tsx:726)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/workshops/${id}/ (web/app/cabinet/page.tsx:726)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:726` calls `DELETE /api/v1/workshops/${id}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/workshops/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f0de4808d05ffd39", "name": "Dangling fetch: POST /api/v1/workshops/${wsId}/photos/ (web/app/cabinet/page.tsx:734)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/workshops/${wsId}/photos/ (web/app/cabinet/page.tsx:734)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:734` calls `POST /api/v1/workshops/${wsId}/photos/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/workshops/<p>/photos`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-1a9f8b82c47309cd", "name": "Dangling fetch: DELETE /api/v1/workshops/${wsId}/photos/${photoId}/ (web/app/cabinet/page.tsx:742)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/workshops/${wsId}/photos/${photoId}/ (web/app/cabinet/page.tsx:742)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:742` calls `DELETE /api/v1/workshops/${wsId}/photos/${photoId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/workshops/<p>/photos/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a5c01bb292def2e4", "name": "Dangling fetch: DELETE /api/v1/follow/${userId}/ (web/app/cabinet/page.tsx:749)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/follow/${userId}/ (web/app/cabinet/page.tsx:749)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:749` calls `DELETE /api/v1/follow/${userId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/follow/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-77c3ce7286023ac6", "name": "Dangling fetch: DELETE /api/v1/favorites/${kind}/${objectId}/ (web/app/cabinet/page.tsx:754)", "shortDescription": {"text": "Dangling fetch: DELETE /api/v1/favorites/${kind}/${objectId}/ (web/app/cabinet/page.tsx:754)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:754` calls `DELETE /api/v1/favorites/${kind}/${objectId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/favorites/<p>/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-eec6503b02a86273", "name": "Dangling fetch: GET /api/v1/profiles/fan-matches/ (web/app/cabinet/page.tsx:761)", "shortDescription": {"text": "Dangling fetch: GET /api/v1/profiles/fan-matches/ (web/app/cabinet/page.tsx:761)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:761` calls `GET /api/v1/profiles/fan-matches/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/profiles/fan-matches`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-741679e32c591133", "name": "Dangling fetch: POST /api/v1/follow/${userId}/ (web/app/cabinet/page.tsx:768)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/follow/${userId}/ (web/app/cabinet/page.tsx:768)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:768` calls `POST /api/v1/follow/${userId}/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/follow/<p>`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-192781ab035e04f4", "name": "Dangling fetch: POST /api/v1/auth/change-password/ (web/app/cabinet/page.tsx:778)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/change-password/ (web/app/cabinet/page.tsx:778)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:778` calls `POST /api/v1/auth/change-password/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/change-password`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-3320b1cb2264f914", "name": "Dangling fetch: POST /api/v1/auth/change-email/ (web/app/cabinet/page.tsx:793)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/change-email/ (web/app/cabinet/page.tsx:793)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:793` calls `POST /api/v1/auth/change-email/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/change-email`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-a60de197e2e04090", "name": "Dangling fetch: POST /api/v1/auth/change-email/confirm/ (web/app/cabinet/page.tsx:807)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/change-email/confirm/ (web/app/cabinet/page.tsx:807)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:807` calls `POST /api/v1/auth/change-email/confirm/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/change-email/confirm`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-67efad2c4c5c6603", "name": "Dangling fetch: POST /api/v1/auth/delete-account/ (web/app/cabinet/page.tsx:823)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/delete-account/ (web/app/cabinet/page.tsx:823)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:823` calls `POST /api/v1/auth/delete-account/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/delete-account`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-f79578c17d130653", "name": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/cabinet/page.tsx:2320)", "shortDescription": {"text": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/cabinet/page.tsx:2320)"}, "fullDescription": {"text": "`web/app/cabinet/page.tsx:2320` calls `POST /api/v1/auth/logout/` but no backend route matches that path. This is a runtime 404 waiting to happen.\n\nTool: fetch\nNormalized path used for matching: `/v1/auth/logout`\nIf this points at an external API, prefix it with `https://` so the matcher skips it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "high", "confidence": 1.0}}, {"id": "scanner-676f12e4b7455e41", "name": "Unused endpoint: ANY /stats/", "shortDescription": {"text": "Unused endpoint: ANY /stats/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /stats/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a9d6417e8feb9dc", "name": "Unused endpoint: ANY /search/", "shortDescription": {"text": "Unused endpoint: ANY /search/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /search/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c940aa311a121ee5", "name": "Unused endpoint: ANY /analytics/me/", "shortDescription": {"text": "Unused endpoint: ANY /analytics/me/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /analytics/me/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c6fb489d0ea4171b", "name": "Unused endpoint: ANY /feed/", "shortDescription": {"text": "Unused endpoint: ANY /feed/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /feed/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ce2b53a5ca6f724d", "name": "Unused endpoint: ANY /auth/", "shortDescription": {"text": "Unused endpoint: ANY /auth/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /auth/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1a6d91f2236825bf", "name": "Unused endpoint: ANY /", "shortDescription": {"text": "Unused endpoint: ANY /"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a47187ad6c58d81", "name": "Unused endpoint: ANY /admin-panel/users/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cfb96e446d4a0e40", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-roles/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-roles/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/set-roles/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f08592a7ae3a737f", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-staff/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-staff/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/set-staff/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3d4f5ee69be527f8", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-active/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-active/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/set-active/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4ed8ea1aa40c08f3", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/delete/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/delete/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/delete/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c7a566431649fd1d", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/reset-password/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/reset-password/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/reset-password/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5a0cf2e98830d21f", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/subscriptions/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/subscriptions/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/subscriptions/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-ae2fdd1d1dc221a9", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/subscriptions/<int:target_id>/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/subscriptions/<int:target_id>/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/subscriptions/<int:target_id>/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-46269bad8e8fc0e3", "name": "Unused endpoint: ANY /admin-panel/invites/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/invites/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/invites/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-48a65551ecd12bed", "name": "Unused endpoint: ANY /admin-panel/invites/<int:pk>/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/invites/<int:pk>/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/invites/<int:pk>/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-1efb30f88f11b794", "name": "Unused endpoint: ANY /admin-panel/stats/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/stats/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/stats/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e3caf39cb2c101a8", "name": "Unused endpoint: ANY /admin-panel/workshops/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/workshops/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/workshops/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-5938fb9d534f49b2", "name": "Unused endpoint: ANY /admin-panel/workshops/<int:pk>/delete/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/workshops/<int:pk>/delete/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/workshops/<int:pk>/delete/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-cef0fcf39a8897b8", "name": "Unused endpoint: ANY /admin-panel/workshops/<int:pk>/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/workshops/<int:pk>/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/workshops/<int:pk>/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-daa9016f2692a0fb", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/workshops/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/workshops/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/workshops/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-e43e0d4bef9a6b95", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/photos/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/photos/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/photos/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9e54cc3994eaaeed", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/photos/<int:photo_id>/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/photos/<int:photo_id>/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/photos/<int:photo_id>/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-235e0352e64e46a5", "name": "Unused endpoint: ANY /admin-panel/listings/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/listings/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/listings/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a8e9956bddcd0996", "name": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/set-active/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/set-active/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/listings/<int:pk>/set-active/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-c1968a3801ad4fef", "name": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/update/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/update/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/listings/<int:pk>/update/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97bd0b49fecfb483", "name": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/delete/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/delete/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/listings/<int:pk>/delete/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-933b8011e6107c3c", "name": "Unused endpoint: ANY /admin-panel/products/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/products/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/products/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-583c355a2fbe8621", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/products/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/products/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/products/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-446950ed24ddcfa6", "name": "Unused endpoint: ANY /admin-panel/products/<int:pk>/set-active/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/products/<int:pk>/set-active/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/products/<int:pk>/set-active/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f227858f4efad11d", "name": "Unused endpoint: ANY /admin-panel/products/<int:pk>/update/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/products/<int:pk>/update/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/products/<int:pk>/update/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-f6aef989085d6d0a", "name": "Unused endpoint: ANY /admin-panel/products/<int:pk>/delete/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/products/<int:pk>/delete/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/products/<int:pk>/delete/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-d1e7830cbf8f7331", "name": "Unused endpoint: ANY /admin-panel/users/<int:pk>/slots/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/slots/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/users/<int:pk>/slots/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a5abd54993af42f2", "name": "Unused endpoint: ANY /admin-panel/slots/<int:pk>/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/slots/<int:pk>/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/slots/<int:pk>/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-4e9d335fdb75a3fb", "name": "Unused endpoint: ANY /admin-panel/orders/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/orders/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/orders/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-bc5a5a0b58a46ba3", "name": "Unused endpoint: ANY /admin-panel/orders/<int:pk>/set-status/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/orders/<int:pk>/set-status/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/orders/<int:pk>/set-status/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-455f05635635acb7", "name": "Unused endpoint: ANY /admin-panel/subscriptions/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/subscriptions/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/subscriptions/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-97f8aed629ee8aba", "name": "Unused endpoint: ANY /admin-panel/subscriptions/<int:pk>/", "shortDescription": {"text": "Unused endpoint: ANY /admin-panel/subscriptions/<int:pk>/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin-panel/subscriptions/<int:pk>/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-74fa90f3eaebb0b0", "name": "Unused endpoint: ANY /schema/", "shortDescription": {"text": "Unused endpoint: ANY /schema/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /schema/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-192a68a6069f2ab7", "name": "Unused endpoint: ANY /docs/", "shortDescription": {"text": "Unused endpoint: ANY /docs/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /docs/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7309bf2446873ccc", "name": "Unused endpoint: ANY /admin/", "shortDescription": {"text": "Unused endpoint: ANY /admin/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /admin/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-eaeb186e445cb4b2", "name": "Unused endpoint: ANY /api/v1/", "shortDescription": {"text": "Unused endpoint: ANY /api/v1/"}, "fullDescription": {"text": "`backend/config/urls.py` declares `ANY /api/v1/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-81f7517bb8f42c00", "name": "Unused endpoint: ANY /auth/register/", "shortDescription": {"text": "Unused endpoint: ANY /auth/register/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /auth/register/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-3ad71917023127ab", "name": "Unused endpoint: ANY /auth/invite-check/", "shortDescription": {"text": "Unused endpoint: ANY /auth/invite-check/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /auth/invite-check/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2517dae61e646158", "name": "Unused endpoint: ANY /auth/login/", "shortDescription": {"text": "Unused endpoint: ANY /auth/login/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /auth/login/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-aeeb94f5cc9f0484", "name": "Unused endpoint: ANY /auth/logout/", "shortDescription": {"text": "Unused endpoint: ANY /auth/logout/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /auth/logout/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-2a241041138d3e68", "name": "Unused endpoint: ANY /auth/me/", "shortDescription": {"text": "Unused endpoint: ANY /auth/me/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /auth/me/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-188e4699d9e268a2", "name": "Unused endpoint: ANY /auth/change-password/", "shortDescription": {"text": "Unused endpoint: ANY /auth/change-password/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /auth/change-password/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-9eb84d8d4da2b383", "name": "Unused endpoint: ANY /auth/change-email/", "shortDescription": {"text": "Unused endpoint: ANY /auth/change-email/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /auth/change-email/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}, {"id": "scanner-7e5c79092699355b", "name": "Unused endpoint: ANY /auth/change-email/confirm/", "shortDescription": {"text": "Unused endpoint: ANY /auth/change-email/confirm/"}, "fullDescription": {"text": "`backend/apps/users/urls.py` declares `ANY /auth/change-email/confirm/` but no frontend code we scanned calls it. This is fine if the endpoint serves external clients (mobile app, third-party, server-side webhooks). Otherwise it's dead code \u2014 consider removing or documenting who consumes it."}, "properties": {"scanner": "scanner-primary", "layer": "api", "severity": "low", "confidence": 1.0}}]}}, "automationDetails": {"id": "repobility/20070"}, "properties": {"repository": "sovest905-blip/cosplayhub", "repoUrl": "https://github.com/sovest905-blip/cosplayhub", "branch": "main"}, "results": [{"ruleId": "scanner-b0865530ccf1e5ed", "level": "warning", "message": {"text": "Privileged port 28 in use"}, "properties": {"repobilityId": "5c3f00b3e839840d", "scanner": "scanner-primary", "fingerprint": "b0865530ccf1e5ed", "layer": "network", "severity": "medium", "confidence": 1.0, "tags": ["security", "ports"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/docker-compose.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-a5823f1252b6cda1", "level": "warning", "message": {"text": "Dockerfile runs as root: web/Dockerfile"}, "properties": {"repobilityId": "ee2f067d8416357d", "scanner": "scanner-primary", "fingerprint": "a5823f1252b6cda1", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-213dadc0ee5a5b00", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: node:22-alpine"}, "properties": {"repobilityId": "4ac9af825a6a40ea", "scanner": "scanner-primary", "fingerprint": "213dadc0ee5a5b00", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web/Dockerfile"}, "region": {"startLine": 2}}}]}, {"ruleId": "scanner-1f66ad88286ca30a", "level": "warning", "message": {"text": "Dockerfile runs as root: backend/Dockerfile"}, "properties": {"repobilityId": "7afd2b0e8a8c9eeb", "scanner": "scanner-primary", "fingerprint": "1f66ad88286ca30a", "layer": "hardware", "severity": "medium", "confidence": 1.0, "tags": ["security", "container"]}}, {"ruleId": "scanner-714c31ca9f474ae6", "level": "note", "message": {"text": "Docker base image is tag-pinned but not digest-pinned: python:3.12-slim"}, "properties": {"repobilityId": "f614a1e41f331b37", "scanner": "scanner-primary", "fingerprint": "714c31ca9f474ae6", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["supply-chain", "docker", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/Dockerfile"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-aa5acaa49eb8315b", "level": "note", "message": {"text": "Containers defined but no K8s/orchestration manifest found"}, "properties": {"repobilityId": "b230ea9b68736081", "scanner": "scanner-primary", "fingerprint": "aa5acaa49eb8315b", "layer": "hardware", "severity": "low", "confidence": 1.0, "tags": ["coverage", "deployment"]}}, {"ruleId": "scanner-395e631573c48116", "level": "error", "message": {"text": "Possible secret in backend/conftest.py"}, "properties": {"repobilityId": "4e6d39356b7d42e6", "scanner": "scanner-primary", "fingerprint": "395e631573c48116", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/conftest.py"}, "region": {"startLine": 20}}}]}, {"ruleId": "scanner-ce98ebbab663b976", "level": "error", "message": {"text": "Possible secret in backend/apps/profiles/management/commands/seed_demo.py"}, "properties": {"repobilityId": "6eadc9433ad6a622", "scanner": "scanner-primary", "fingerprint": "ce98ebbab663b976", "layer": "security", "severity": "critical", "confidence": 1.0, "tags": ["secrets"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/profiles/management/commands/seed_demo.py"}, "region": {"startLine": 23}}}]}, {"ruleId": "scanner-28c4a04bd807da0c", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "0bc463708914950e", "scanner": "scanner-primary", "fingerprint": "28c4a04bd807da0c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/deploy.yml"}, "region": {"startLine": 97}}}]}, {"ruleId": "scanner-5a086a90ed8617b0", "level": "note", "message": {"text": "Very large file: web/app/admin-panel/page.tsx (1741 lines)"}, "properties": {"repobilityId": "7b03dfdfbab565bc", "scanner": "scanner-primary", "fingerprint": "5a086a90ed8617b0", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-b0bf3ee2d5e78372", "level": "note", "message": {"text": "Very large file: web/app/cabinet/page.tsx (2344 lines)"}, "properties": {"repobilityId": "2e0219cdfbfba789", "scanner": "scanner-primary", "fingerprint": "b0bf3ee2d5e78372", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["complexity"]}}, {"ruleId": "scanner-ea3b5e389d8c9c0f", "level": "note", "message": {"text": "Low test-to-source ratio"}, "properties": {"repobilityId": "ef7b2552cc00a375", "scanner": "scanner-primary", "fingerprint": "ea3b5e389d8c9c0f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["tests"]}}, {"ruleId": "scanner-141b30a41e03817b", "level": "note", "message": {"text": "No license file detected"}, "properties": {"repobilityId": "18a7707018ef8714", "scanner": "scanner-primary", "fingerprint": "141b30a41e03817b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["license", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-f61e9dc22135856f", "level": "note", "message": {"text": "Node manifest has dependencies but no lockfile: web/package.json"}, "properties": {"repobilityId": "dd661d63588916a7", "scanner": "scanner-primary", "fingerprint": "f61e9dc22135856f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["dependency", "lockfile", "reproducibility", "generated-repo-pattern"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "web/package.json"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-72b2a6250083a784", "level": "warning", "message": {"text": "Placeholder or mock-heavy implementation detected"}, "properties": {"repobilityId": "83e9c334df8889d9", "scanner": "scanner-primary", "fingerprint": "72b2a6250083a784", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "incomplete", "generated-repo-pattern"]}}, {"ruleId": "scanner-2d0c7b7ab8f8aacf", "level": "warning", "message": {"text": "Critical user flow still appears backed by mock or placeholder data"}, "properties": {"repobilityId": "bbc973f0f2e74287", "scanner": "scanner-primary", "fingerprint": "2d0c7b7ab8f8aacf", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["placeholder", "mock-data", "critical-flow", "generated-repo-pattern"]}}, {"ruleId": "scanner-b9088664ace7f748", "level": "note", "message": {"text": "Composite production-readiness gap"}, "properties": {"repobilityId": "7e6cf52226493535", "scanner": "scanner-primary", "fingerprint": "b9088664ace7f748", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["production-readiness", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-ea8f3013f588db25", "level": "note", "message": {"text": "Shallow git history limits provenance confidence"}, "properties": {"repobilityId": "7e6c9f90201d59e7", "scanner": "scanner-primary", "fingerprint": "ea8f3013f588db25", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-8424db9c75e04ba4", "level": "none", "message": {"text": "Very short observed git history"}, "properties": {"repobilityId": "13a1002ef781e3b2", "scanner": "scanner-primary", "fingerprint": "8424db9c75e04ba4", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["provenance", "git-history", "generated-repo-pattern"]}}, {"ruleId": "scanner-4366bf2d973ddc8e", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/components/MessagesPanel.tsx:73"}, "properties": {"repobilityId": "d5a0454cf80573d4", "scanner": "scanner-primary", "fingerprint": "4366bf2d973ddc8e", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-73024658339f5be8", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/components/FollowButton.tsx:31"}, "properties": {"repobilityId": "425f5e0279733409", "scanner": "scanner-primary", "fingerprint": "73024658339f5be8", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-d9ec19bb74d812a0", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/teams/[id]/page.tsx:9"}, "properties": {"repobilityId": "3a294c68d72df4c1", "scanner": "scanner-primary", "fingerprint": "d9ec19bb74d812a0", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-e46a398b4bec6f3f", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/guides/new/page.tsx:35"}, "properties": {"repobilityId": "cacd65884942e685", "scanner": "scanner-primary", "fingerprint": "e46a398b4bec6f3f", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-745c67f099c1e3bd", "level": "warning", "message": {"text": "`fetch()` without try/.catch or AbortSignal \u2014 web/app/cabinet/page.tsx:343"}, "properties": {"repobilityId": "cc65b63ffa7015d4", "scanner": "scanner-primary", "fingerprint": "745c67f099c1e3bd", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "fragile-runtime", "robustness"]}}, {"ruleId": "scanner-fc8dce7b050f35c5", "level": "note", "message": {"text": "Legacy-named symbol `api_v1` in backend/config/urls.py:29"}, "properties": {"repobilityId": "d0dc820acb7cb233", "scanner": "scanner-primary", "fingerprint": "fc8dce7b050f35c5", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "legacy-marker", "dead-code"]}}, {"ruleId": "scanner-374bd85457eb7e57", "level": "warning", "message": {"text": "Likely N+1 query: `for lk in \u2026` triggers a query per row \u2014 backend/common/feed.py:85"}, "properties": {"repobilityId": "681a6ee12d2a15a5", "scanner": "scanner-primary", "fingerprint": "374bd85457eb7e57", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/feed.py"}, "region": {"startLine": 85}}}]}, {"ruleId": "scanner-d015eddc29a199b3", "level": "warning", "message": {"text": "Likely N+1 query: `for ev in \u2026` triggers a query per row \u2014 backend/common/feed.py:104"}, "properties": {"repobilityId": "df588a5737c56d25", "scanner": "scanner-primary", "fingerprint": "d015eddc29a199b3", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/feed.py"}, "region": {"startLine": 104}}}]}, {"ruleId": "scanner-98dd40f7eacd2a43", "level": "warning", "message": {"text": "Likely N+1 query: `for nw in \u2026` triggers a query per row \u2014 backend/common/feed.py:114"}, "properties": {"repobilityId": "541dc01f45b18822", "scanner": "scanner-primary", "fingerprint": "98dd40f7eacd2a43", "layer": "quality", "severity": "medium", "confidence": 1.0, "tags": ["integrity", "n-plus-one", "performance"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/feed.py"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-4265a1ad3026ad4a", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/apps/billing/migrations/0003_remove_subscription_uniq_user_pro_and_more.py:1"}, "properties": {"repobilityId": "131936e1f4339f45", "scanner": "scanner-primary", "fingerprint": "4265a1ad3026ad4a", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-b2f0a476cb6de078", "level": "none", "message": {"text": "Commented-code block (5 lines) in backend/apps/messaging/views.py:38"}, "properties": {"repobilityId": "eff66e25e89afe03", "scanner": "scanner-primary", "fingerprint": "b2f0a476cb6de078", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "commented-code", "dead-code"]}}, {"ruleId": "scanner-250f57e8a1dbd3c5", "level": "none", "message": {"text": "4 env vars used in code but missing from .env.example"}, "properties": {"repobilityId": "57584f22b735b5ee", "scanner": "scanner-primary", "fingerprint": "250f57e8a1dbd3c5", "layer": "quality", "severity": "info", "confidence": 1.0, "tags": ["integrity", "config-drift"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "8fd4ba227ce9bcef", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "67522913da52e035", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "ac8484bbf176efcc", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-46969939caf8120b", "level": "note", "message": {"text": "Near-duplicate function bodies in 9 places"}, "properties": {"repobilityId": "915b0145c2bc3f8d", "scanner": "scanner-primary", "fingerprint": "46969939caf8120b", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-02525d39071dd2c7", "level": "note", "message": {"text": "Near-duplicate function bodies in 5 places"}, "properties": {"repobilityId": "68ca193764e09d64", "scanner": "scanner-primary", "fingerprint": "02525d39071dd2c7", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-0027e313ade46c8f", "level": "note", "message": {"text": "Near-duplicate function bodies in 7 places"}, "properties": {"repobilityId": "180c0f291acb6499", "scanner": "scanner-primary", "fingerprint": "0027e313ade46c8f", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-49c98f7cedd9c977", "level": "note", "message": {"text": "Near-duplicate function bodies in 4 places"}, "properties": {"repobilityId": "40663544b6018d05", "scanner": "scanner-primary", "fingerprint": "49c98f7cedd9c977", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "24ebb30bf5f25b50", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-76a2f6818267a9a8", "level": "note", "message": {"text": "Near-duplicate function bodies in 8 places"}, "properties": {"repobilityId": "0ec40f3cbcc00998", "scanner": "scanner-primary", "fingerprint": "76a2f6818267a9a8", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "1a2cf98ed8833bbc", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-122053f21232d80c", "level": "note", "message": {"text": "Near-duplicate function bodies in 14 places"}, "properties": {"repobilityId": "264023eb8b8a2652", "scanner": "scanner-primary", "fingerprint": "122053f21232d80c", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "92713c377fe94811", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "2b2df76aa9b7c971", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "4d75e088b7a01926", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "fd5f423eae332daf", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1f17c7c9552fc0e7", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "25d760e889dadf29", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-be46ea126aa5d8dc", "level": "note", "message": {"text": "Near-duplicate function bodies in 3 places"}, "properties": {"repobilityId": "83585a9d365f85ad", "scanner": "scanner-primary", "fingerprint": "be46ea126aa5d8dc", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "cf663bd269a1b346", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-2c04133e54348533", "level": "note", "message": {"text": "Near-duplicate function bodies in 2 places"}, "properties": {"repobilityId": "1c019d2d60377db6", "scanner": "scanner-primary", "fingerprint": "2c04133e54348533", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["integrity", "duplicate", "dry"]}}, {"ruleId": "scanner-4ec57f1296f1bc06", "level": "warning", "message": {"text": "Django CBV `AdminSubscriptionsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_billing.py:47"}, "properties": {"repobilityId": "8fc1e7008b06f659", "scanner": "scanner-primary", "fingerprint": "4ec57f1296f1bc06", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_billing.py"}, "region": {"startLine": 47}}}]}, {"ruleId": "scanner-ee2a9cbc217b2939", "level": "warning", "message": {"text": "Django CBV `AdminSubscriptionUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_billing.py:113"}, "properties": {"repobilityId": "91320616c064dfef", "scanner": "scanner-primary", "fingerprint": "ee2a9cbc217b2939", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_billing.py"}, "region": {"startLine": 113}}}]}, {"ruleId": "scanner-d100d8b069a0554c", "level": "warning", "message": {"text": "Django CBV `AdminStatsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:30"}, "properties": {"repobilityId": "4addcd737acf197b", "scanner": "scanner-primary", "fingerprint": "d100d8b069a0554c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 30}}}]}, {"ruleId": "scanner-896973906dba4e5a", "level": "warning", "message": {"text": "Django CBV `AdminWorkshopsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:54"}, "properties": {"repobilityId": "05d36753d7a10bfd", "scanner": "scanner-primary", "fingerprint": "896973906dba4e5a", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-6616e717e72ed8fc", "level": "warning", "message": {"text": "Django CBV `AdminWorkshopDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:80"}, "properties": {"repobilityId": "ba55358cfb79534d", "scanner": "scanner-primary", "fingerprint": "6616e717e72ed8fc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 80}}}]}, {"ruleId": "scanner-6bc57842a5655061", "level": "warning", "message": {"text": "Django CBV `AdminUserWorkshopsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:91"}, "properties": {"repobilityId": "d81a0832c381038d", "scanner": "scanner-primary", "fingerprint": "6bc57842a5655061", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 91}}}]}, {"ruleId": "scanner-47c5d1443a61fb9c", "level": "warning", "message": {"text": "Django CBV `AdminWorkshopUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:111"}, "properties": {"repobilityId": "92ab53f109133d9e", "scanner": "scanner-primary", "fingerprint": "47c5d1443a61fb9c", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 111}}}]}, {"ruleId": "scanner-871531828cdab09d", "level": "warning", "message": {"text": "Django CBV `AdminListingsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:124"}, "properties": {"repobilityId": "13ad1f8141b9acbd", "scanner": "scanner-primary", "fingerprint": "871531828cdab09d", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 124}}}]}, {"ruleId": "scanner-6a6b7095164a3330", "level": "warning", "message": {"text": "Django CBV `AdminListingActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:154"}, "properties": {"repobilityId": "05888d7f5d37ee81", "scanner": "scanner-primary", "fingerprint": "6a6b7095164a3330", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 154}}}]}, {"ruleId": "scanner-642539642185708e", "level": "warning", "message": {"text": "Django CBV `AdminListingUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:166"}, "properties": {"repobilityId": "a0de0b6ceb2a8492", "scanner": "scanner-primary", "fingerprint": "642539642185708e", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 166}}}]}, {"ruleId": "scanner-59b4979160e9acec", "level": "warning", "message": {"text": "Django CBV `AdminListingDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:194"}, "properties": {"repobilityId": "f4bce1be8eb818f3", "scanner": "scanner-primary", "fingerprint": "59b4979160e9acec", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 194}}}]}, {"ruleId": "scanner-4893f1960b0ec663", "level": "warning", "message": {"text": "Django CBV `AdminProductsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:205"}, "properties": {"repobilityId": "e3066cf3e63a6b65", "scanner": "scanner-primary", "fingerprint": "4893f1960b0ec663", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 205}}}]}, {"ruleId": "scanner-6c5fe89983fa5961", "level": "warning", "message": {"text": "Django CBV `AdminProductActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:227"}, "properties": {"repobilityId": "f5ef07bc9f69a4d3", "scanner": "scanner-primary", "fingerprint": "6c5fe89983fa5961", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-b6ccb219fafdbf88", "level": "warning", "message": {"text": "Django CBV `AdminProductDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:239"}, "properties": {"repobilityId": "0919afa61f3a6b95", "scanner": "scanner-primary", "fingerprint": "b6ccb219fafdbf88", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 239}}}]}, {"ruleId": "scanner-6186d02641193475", "level": "warning", "message": {"text": "Django CBV `AdminUserProductsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:250"}, "properties": {"repobilityId": "1dcca9aedbc58dc6", "scanner": "scanner-primary", "fingerprint": "6186d02641193475", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 250}}}]}, {"ruleId": "scanner-37092f30f88f4826", "level": "warning", "message": {"text": "Django CBV `AdminProductUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:270"}, "properties": {"repobilityId": "bcad0d24ec5816b6", "scanner": "scanner-primary", "fingerprint": "37092f30f88f4826", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 270}}}]}, {"ruleId": "scanner-e45f4b411c0082b1", "level": "warning", "message": {"text": "Django CBV `AdminUserSlotsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:283"}, "properties": {"repobilityId": "6ce35cc68f69c841", "scanner": "scanner-primary", "fingerprint": "e45f4b411c0082b1", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 283}}}]}, {"ruleId": "scanner-6fa888224807e3da", "level": "warning", "message": {"text": "Django CBV `AdminSlotUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:303"}, "properties": {"repobilityId": "1d5aeae0a2f64e09", "scanner": "scanner-primary", "fingerprint": "6fa888224807e3da", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 303}}}]}, {"ruleId": "scanner-e880fbfbf2e10a19", "level": "warning", "message": {"text": "Django CBV `AdminUserPhotosView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:326"}, "properties": {"repobilityId": "6846094e7cd0d3a9", "scanner": "scanner-primary", "fingerprint": "e880fbfbf2e10a19", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 326}}}]}, {"ruleId": "scanner-dee3c09f2ecb7fa9", "level": "warning", "message": {"text": "Django CBV `AdminUserPhotoDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:368"}, "properties": {"repobilityId": "9b3342b6f3404452", "scanner": "scanner-primary", "fingerprint": "dee3c09f2ecb7fa9", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 368}}}]}, {"ruleId": "scanner-d3421d424328d961", "level": "warning", "message": {"text": "Django CBV `AdminOrdersView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:379"}, "properties": {"repobilityId": "6a6040a1c8538092", "scanner": "scanner-primary", "fingerprint": "d3421d424328d961", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 379}}}]}, {"ruleId": "scanner-7f685257c7237316", "level": "warning", "message": {"text": "Django CBV `AdminOrderStatusView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_content.py:403"}, "properties": {"repobilityId": "b9fef56b5584068c", "scanner": "scanner-primary", "fingerprint": "7f685257c7237316", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_content.py"}, "region": {"startLine": 403}}}]}, {"ruleId": "scanner-fed9eae162ad2186", "level": "warning", "message": {"text": "Django CBV `AdminUsersView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:45"}, "properties": {"repobilityId": "5153c6b06b418a70", "scanner": "scanner-primary", "fingerprint": "fed9eae162ad2186", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 45}}}]}, {"ruleId": "scanner-6ea5b781f5dbe7bb", "level": "warning", "message": {"text": "Django CBV `AdminUserRolesView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:114"}, "properties": {"repobilityId": "0c9d770e1043f2e8", "scanner": "scanner-primary", "fingerprint": "6ea5b781f5dbe7bb", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 114}}}]}, {"ruleId": "scanner-725906fd449f5d58", "level": "warning", "message": {"text": "Django CBV `AdminUserStaffView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:136"}, "properties": {"repobilityId": "dc21f594d622adce", "scanner": "scanner-primary", "fingerprint": "725906fd449f5d58", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 136}}}]}, {"ruleId": "scanner-015ad905bb8e8d44", "level": "warning", "message": {"text": "Django CBV `AdminUserActiveView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:151"}, "properties": {"repobilityId": "fb329b386425a2de", "scanner": "scanner-primary", "fingerprint": "015ad905bb8e8d44", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 151}}}]}, {"ruleId": "scanner-82ae940dab800961", "level": "warning", "message": {"text": "Django CBV `AdminUserDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:166"}, "properties": {"repobilityId": "3623cb1bf32ad3bc", "scanner": "scanner-primary", "fingerprint": "82ae940dab800961", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 166}}}]}, {"ruleId": "scanner-a5133081f6d24b20", "level": "warning", "message": {"text": "Django CBV `AdminUserSubsView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:196"}, "properties": {"repobilityId": "1cb3933e9c5ca400", "scanner": "scanner-primary", "fingerprint": "a5133081f6d24b20", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 196}}}]}, {"ruleId": "scanner-e1cbcef17c5a2ac8", "level": "warning", "message": {"text": "Django CBV `AdminUserSubDeleteView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:227"}, "properties": {"repobilityId": "a15d4e8515227a75", "scanner": "scanner-primary", "fingerprint": "e1cbcef17c5a2ac8", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 227}}}]}, {"ruleId": "scanner-8296f1480fcc3fa6", "level": "warning", "message": {"text": "Django CBV `AdminInvitesView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:255"}, "properties": {"repobilityId": "8cf66de6a16523a8", "scanner": "scanner-primary", "fingerprint": "8296f1480fcc3fa6", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 255}}}]}, {"ruleId": "scanner-05c8d2b688f78cbc", "level": "warning", "message": {"text": "Django CBV `AdminInviteUpdateView` lacks `LoginRequiredMixin` \u2014 backend/common/admin_panel.py:273"}, "properties": {"repobilityId": "f3ef26a9b4c7127b", "scanner": "scanner-primary", "fingerprint": "05c8d2b688f78cbc", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/common/admin_panel.py"}, "region": {"startLine": 273}}}]}, {"ruleId": "scanner-360a04165c21ac68", "level": "warning", "message": {"text": "Django CBV `MeView` lacks `LoginRequiredMixin` \u2014 backend/apps/users/views.py:125"}, "properties": {"repobilityId": "52f3b6b1eafdb8c2", "scanner": "scanner-primary", "fingerprint": "360a04165c21ac68", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["auth", "auth.django.unauth_view"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/users/views.py"}, "region": {"startLine": 125}}}]}, {"ruleId": "scanner-c490514582048920", "level": "error", "message": {"text": "DRF view `EventViewSet` declares no `permission_classes` \u2014 backend/apps/events/views.py:11"}, "properties": {"repobilityId": "bf1bdb2fed808a00", "scanner": "scanner-primary", "fingerprint": "c490514582048920", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/events/views.py"}, "region": {"startLine": 11}}}]}, {"ruleId": "scanner-2f81a8db35db77e8", "level": "error", "message": {"text": "DRF view `NewsViewSet` declares no `permission_classes` \u2014 backend/apps/news/views.py:9"}, "properties": {"repobilityId": "ceb937a82f33f255", "scanner": "scanner-primary", "fingerprint": "2f81a8db35db77e8", "layer": "security", "severity": "high", "confidence": 1.0, "tags": ["auth", "owasp", "auth.drf.no_permission_classes"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "backend/apps/news/views.py"}, "region": {"startLine": 9}}}]}, {"ruleId": "scanner-5efa175258451b84", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/notifications/page.tsx:33)"}, "properties": {"repobilityId": "eeb72df5d83a4c0c", "scanner": "scanner-primary", "fingerprint": "5efa175258451b84", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9387aba77d65e3c5", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/notifications/ (web/app/notifications/page.tsx:40)"}, "properties": {"repobilityId": "a7e216e60ebe9ef4", "scanner": "scanner-primary", "fingerprint": "9387aba77d65e3c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2672a081551a1881", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/notifications/mark-read/ (web/app/notifications/page.tsx:45)"}, "properties": {"repobilityId": "8cac96b2b1fc920e", "scanner": "scanner-primary", "fingerprint": "2672a081551a1881", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8233128b1fe34bf5", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/login/ (web/app/auth/login/page.tsx:29)"}, "properties": {"repobilityId": "614e50be97ad5598", "scanner": "scanner-primary", "fingerprint": "8233128b1fe34bf5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-538c42b0213472ce", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/forgot-password/ (web/app/auth/forgot-password/page.tsx:28)"}, "properties": {"repobilityId": "a86c43fc541007ad", "scanner": "scanner-primary", "fingerprint": "538c42b0213472ce", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8e7fcd8f6e5280d2", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/reset-password/ (web/app/auth/forgot-password/page.tsx:82)"}, "properties": {"repobilityId": "6feacfc1905d17e7", "scanner": "scanner-primary", "fingerprint": "8e7fcd8f6e5280d2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b304ded672e48f1", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/verify-otp/ (web/app/auth/verify-email/page.tsx:50)"}, "properties": {"repobilityId": "b66a84aa3a67a961", "scanner": "scanner-primary", "fingerprint": "0b304ded672e48f1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1efa21132b6aed97", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/send-otp/ (web/app/auth/verify-email/page.tsx:74)"}, "properties": {"repobilityId": "494720cb2f9e169d", "scanner": "scanner-primary", "fingerprint": "1efa21132b6aed97", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6234e314ff2f8d31", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/verify-telegram-otp/ (web/app/auth/verify-phone/page.tsx:20)"}, "properties": {"repobilityId": "2af8aafa2b684ffc", "scanner": "scanner-primary", "fingerprint": "6234e314ff2f8d31", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-752c2ae7d0b45c5c", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/slots/?owner=${ownerId} (web/app/components/SlotList.tsx:33)"}, "properties": {"repobilityId": "963dbc9ef454e91f", "scanner": "scanner-primary", "fingerprint": "752c2ae7d0b45c5c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-145584d9661f3a9c", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SlotList.tsx:38)"}, "properties": {"repobilityId": "33fc87a5fc7b53e5", "scanner": "scanner-primary", "fingerprint": "145584d9661f3a9c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-daddc0ffc6625825", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SlotList.tsx:47)"}, "properties": {"repobilityId": "6869e6e451e02e6d", "scanner": "scanner-primary", "fingerprint": "daddc0ffc6625825", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f1fb21897415f32a", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/slots/${slot.id}/book/ (web/app/components/SlotList.tsx:49)"}, "properties": {"repobilityId": "a2527fabfefea476", "scanner": "scanner-primary", "fingerprint": "f1fb21897415f32a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e79dffb48c6ece8e", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/slots/${slot.id}/book/ (web/app/components/SlotList.tsx:64)"}, "properties": {"repobilityId": "03a24c5bbbb9b8a1", "scanner": "scanner-primary", "fingerprint": "e79dffb48c6ece8e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-adbf87fcf8bfbc56", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/OrderButton.tsx:26)"}, "properties": {"repobilityId": "7df383fcd772edc5", "scanner": "scanner-primary", "fingerprint": "adbf87fcf8bfbc56", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-634cabae769da736", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/orders/ (web/app/components/OrderButton.tsx:38)"}, "properties": {"repobilityId": "74279cdf6cd2bbc4", "scanner": "scanner-primary", "fingerprint": "634cabae769da736", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8b99f64b67d5fde1", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/OwnerOnly.tsx:21)"}, "properties": {"repobilityId": "61662898cf877acf", "scanner": "scanner-primary", "fingerprint": "8b99f64b67d5fde1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bcb8539ae7dd52f2", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/AuthNav.tsx:16)"}, "properties": {"repobilityId": "f570559fcf82b1ec", "scanner": "scanner-primary", "fingerprint": "bcb8539ae7dd52f2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-615c0e18b5638009", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/messages/unread-count/ (web/app/components/AuthNav.tsx:31)"}, "properties": {"repobilityId": "8c1f7cd1b5f5fd4c", "scanner": "scanner-primary", "fingerprint": "615c0e18b5638009", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-2c1a2c75507e837f", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/notifications/unread-count/ (web/app/components/AuthNav.tsx:32)"}, "properties": {"repobilityId": "e403a1c930779290", "scanner": "scanner-primary", "fingerprint": "2c1a2c75507e837f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-05de970eb02c4ea5", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/components/AuthNav.tsx:44)"}, "properties": {"repobilityId": "11626b8f4cc5ce2c", "scanner": "scanner-primary", "fingerprint": "05de970eb02c4ea5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b77bdaca698b23c0", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/LikeButton.tsx:19)"}, "properties": {"repobilityId": "4ead3a16e9838b7c", "scanner": "scanner-primary", "fingerprint": "b77bdaca698b23c0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9d760d7c78b79b7e", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/looks/${lookId}/like/ (web/app/components/LikeButton.tsx:21)"}, "properties": {"repobilityId": "810c8ffad3ddc72e", "scanner": "scanner-primary", "fingerprint": "9d760d7c78b79b7e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-622c94ccbd468304", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MessagesPanel.tsx:52)"}, "properties": {"repobilityId": "1f1007f5703365e1", "scanner": "scanner-primary", "fingerprint": "622c94ccbd468304", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-94986c780fd4d39a", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/conversations/ (web/app/components/MessagesPanel.tsx:59)"}, "properties": {"repobilityId": "f83230e0782bce00", "scanner": "scanner-primary", "fingerprint": "94986c780fd4d39a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4cc22735f4df0e0a", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/conversations/ (web/app/components/MessagesPanel.tsx:73)"}, "properties": {"repobilityId": "404709c30ea9d30c", "scanner": "scanner-primary", "fingerprint": "4cc22735f4df0e0a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-69b3b237efcdf777", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/conversations/${activeId}/messages/ (web/app/components/MessagesPanel.tsx:100)"}, "properties": {"repobilityId": "5d9e17eb8a0ee81f", "scanner": "scanner-primary", "fingerprint": "69b3b237efcdf777", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b043ddd5193d6b33", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/conversations/${activeId}/messages/ (web/app/components/MessagesPanel.tsx:121)"}, "properties": {"repobilityId": "dd74331c95e6bc3f", "scanner": "scanner-primary", "fingerprint": "b043ddd5193d6b33", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-fd00f1e62c6b11a5", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MobileMenu.tsx:49)"}, "properties": {"repobilityId": "9b5b9649de73e07f", "scanner": "scanner-primary", "fingerprint": "fd00f1e62c6b11a5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e6465d0688054a1a", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/messages/unread-count/ (web/app/components/MobileMenu.tsx:55)"}, "properties": {"repobilityId": "ba66ec1d6ff87ee3", "scanner": "scanner-primary", "fingerprint": "e6465d0688054a1a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7d73a5b657c04b15", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/notifications/unread-count/ (web/app/components/MobileMenu.tsx:57)"}, "properties": {"repobilityId": "7452010d49e0480a", "scanner": "scanner-primary", "fingerprint": "7d73a5b657c04b15", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ddf666599417d533", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/components/MobileMenu.tsx:81)"}, "properties": {"repobilityId": "9c258c8f780da9bc", "scanner": "scanner-primary", "fingerprint": "ddf666599417d533", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9feacb85371057fe", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/GatedButton.tsx:23)"}, "properties": {"repobilityId": "417086592162449f", "scanner": "scanner-primary", "fingerprint": "9feacb85371057fe", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ad674ec6124fd44f", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/search/?q=${encodeURIComponent(term)} (web/app/components/SearchBox.tsx:50)"}, "properties": {"repobilityId": "0e38e8fd3e1fc92c", "scanner": "scanner-primary", "fingerprint": "ad674ec6124fd44f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a94fbe8b5da53448", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/GoingButton.tsx:25)"}, "properties": {"repobilityId": "c082cb38c7084d75", "scanner": "scanner-primary", "fingerprint": "a94fbe8b5da53448", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4b0df64ee997a836", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/events/${eventId}/attend/ (web/app/components/GoingButton.tsx:27)"}, "properties": {"repobilityId": "7612c148ed707fdc", "scanner": "scanner-primary", "fingerprint": "4b0df64ee997a836", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8fc2494f0d5f24ca", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MarketListings.tsx:19)"}, "properties": {"repobilityId": "a9d518936f0ab67f", "scanner": "scanner-primary", "fingerprint": "8fc2494f0d5f24ca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9e019f1653793e2a", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/PostListingButton.tsx:23)"}, "properties": {"repobilityId": "6e3a24dcbed5e284", "scanner": "scanner-primary", "fingerprint": "9e019f1653793e2a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-19ae866ea91851d9", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/favorites/${kind}/${objectId}/ (web/app/components/SaveButton.tsx:27)"}, "properties": {"repobilityId": "79c95a2238af4544", "scanner": "scanner-primary", "fingerprint": "19ae866ea91851d9", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-752c773c348f5195", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/SaveButton.tsx:45)"}, "properties": {"repobilityId": "8771a02403d310f3", "scanner": "scanner-primary", "fingerprint": "752c773c348f5195", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-abbc8a1a37b451ba", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/favorites/${kind}/${objectId}/ (web/app/components/SaveButton.tsx:50)"}, "properties": {"repobilityId": "7bb846f5a16aeec0", "scanner": "scanner-primary", "fingerprint": "abbc8a1a37b451ba", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4082cd527d91e944", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/JobListings.tsx:18)"}, "properties": {"repobilityId": "0976f8c86a024525", "scanner": "scanner-primary", "fingerprint": "4082cd527d91e944", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1442a2f3ad1446a7", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/MessageButton.tsx:23)"}, "properties": {"repobilityId": "aec91f1874098501", "scanner": "scanner-primary", "fingerprint": "1442a2f3ad1446a7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ff7435fe1d9c1d5", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/FollowButton.tsx:26)"}, "properties": {"repobilityId": "866f2f4f1e3a197f", "scanner": "scanner-primary", "fingerprint": "4ff7435fe1d9c1d5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-53a30d13165dc9d6", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/follow/${userId}/ (web/app/components/FollowButton.tsx:31)"}, "properties": {"repobilityId": "53ed63c5b266c3f9", "scanner": "scanner-primary", "fingerprint": "53a30d13165dc9d6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-296a6c48d844bd0f", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/FollowButton.tsx:49)"}, "properties": {"repobilityId": "a50e46f41e190292", "scanner": "scanner-primary", "fingerprint": "296a6c48d844bd0f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-20fff61f44996db3", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/follow/${userId}/ (web/app/components/FollowButton.tsx:54)"}, "properties": {"repobilityId": "887c7bc8f78a2253", "scanner": "scanner-primary", "fingerprint": "20fff61f44996db3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8418f6b194554744", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/components/ProCta.tsx:28)"}, "properties": {"repobilityId": "62cb8194c8db6664", "scanner": "scanner-primary", "fingerprint": "8418f6b194554744", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b7bb3f7e742cd011", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/billing/activate/ (web/app/components/ProCta.tsx:38)"}, "properties": {"repobilityId": "7166f61789593870", "scanner": "scanner-primary", "fingerprint": "b7bb3f7e742cd011", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1d208f04643b9055", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/teams/new/page.tsx:15)"}, "properties": {"repobilityId": "0d8fe41d36a21789", "scanner": "scanner-primary", "fingerprint": "1d208f04643b9055", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-587a4a61f06e1a80", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/teams/ (web/app/teams/new/page.tsx:30)"}, "properties": {"repobilityId": "ff87aa72a19731a7", "scanner": "scanner-primary", "fingerprint": "587a4a61f06e1a80", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f8074b3157c02027", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1${path} (web/app/teams/[id]/page.tsx:9)"}, "properties": {"repobilityId": "6d0971cd3c4a7435", "scanner": "scanner-primary", "fingerprint": "f8074b3157c02027", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b4944649463dc6d3", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/feed/ (web/app/feed/page.tsx:28)"}, "properties": {"repobilityId": "f8325c97dfdd0ea7", "scanner": "scanner-primary", "fingerprint": "b4944649463dc6d3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b742703c3ab218e4", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1${path} (web/app/admin-panel/page.tsx:53)"}, "properties": {"repobilityId": "7db49a8bd61b3911", "scanner": "scanner-primary", "fingerprint": "b742703c3ab218e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-aa4340448a5e8105", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/guides/new/page.tsx:15)"}, "properties": {"repobilityId": "be77ea77f0e3ed9a", "scanner": "scanner-primary", "fingerprint": "aa4340448a5e8105", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ecec06a75501eeb1", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/guides/ (web/app/guides/new/page.tsx:28)"}, "properties": {"repobilityId": "b9d789c30e70cff8", "scanner": "scanner-primary", "fingerprint": "ecec06a75501eeb1", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-bcac8dac299e5530", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/guides/${data.id}/photos/ (web/app/guides/new/page.tsx:35)"}, "properties": {"repobilityId": "50a6dad0eb838de9", "scanner": "scanner-primary", "fingerprint": "bcac8dac299e5530", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8241a406578a362b", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/conversations/ (web/app/cabinet/page.tsx:192)"}, "properties": {"repobilityId": "922d17d1b593d4e4", "scanner": "scanner-primary", "fingerprint": "8241a406578a362b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-798d9e418171356d", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/cabinet/page.tsx:203)"}, "properties": {"repobilityId": "461bc12a5c88e056", "scanner": "scanner-primary", "fingerprint": "798d9e418171356d", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-46b547d0190c84eb", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/orders/ (web/app/cabinet/page.tsx:232)"}, "properties": {"repobilityId": "082d83900e26c43a", "scanner": "scanner-primary", "fingerprint": "46b547d0190c84eb", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-29abd0aad573cfc7", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/events/mine/ (web/app/cabinet/page.tsx:240)"}, "properties": {"repobilityId": "f93fbe9295c9ee7b", "scanner": "scanner-primary", "fingerprint": "29abd0aad573cfc7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-33e9dfd16e9290fa", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/analytics/me/ (web/app/cabinet/page.tsx:244)"}, "properties": {"repobilityId": "be7568ed21cce3d8", "scanner": "scanner-primary", "fingerprint": "33e9dfd16e9290fa", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3578c4f757d53c90", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/orders/incoming/ (web/app/cabinet/page.tsx:248)"}, "properties": {"repobilityId": "951d0ffa67237a08", "scanner": "scanner-primary", "fingerprint": "3578c4f757d53c90", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8f38da5defee44b6", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/listings/ (web/app/cabinet/page.tsx:255)"}, "properties": {"repobilityId": "4ada802865d91350", "scanner": "scanner-primary", "fingerprint": "8f38da5defee44b6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3a8705f4a1c5806b", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/follow/following/ (web/app/cabinet/page.tsx:263)"}, "properties": {"repobilityId": "3854a1f9548cc224", "scanner": "scanner-primary", "fingerprint": "3a8705f4a1c5806b", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-e13120a300be1964", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/follow/followers/ (web/app/cabinet/page.tsx:267)"}, "properties": {"repobilityId": "adafb99437bfbacf", "scanner": "scanner-primary", "fingerprint": "e13120a300be1964", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-8bf687d79a8a5aea", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/favorites/ (web/app/cabinet/page.tsx:271)"}, "properties": {"repobilityId": "5c741e21318b9e13", "scanner": "scanner-primary", "fingerprint": "8bf687d79a8a5aea", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1da98672115c38a6", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/profiles/me/photos/ (web/app/cabinet/page.tsx:275)"}, "properties": {"repobilityId": "6a33a39c1bea45e1", "scanner": "scanner-primary", "fingerprint": "1da98672115c38a6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c71c00baf1e67a3c", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/looks/?mine=1 (web/app/cabinet/page.tsx:279)"}, "properties": {"repobilityId": "535957cbda48e3e8", "scanner": "scanner-primary", "fingerprint": "c71c00baf1e67a3c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-613aa3f2ca2eab34", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/products/?mine=1 (web/app/cabinet/page.tsx:287)"}, "properties": {"repobilityId": "655328293eafdeb1", "scanner": "scanner-primary", "fingerprint": "613aa3f2ca2eab34", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1315d240629c3556", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/slots/?mine=1 (web/app/cabinet/page.tsx:295)"}, "properties": {"repobilityId": "3b11002c9da50949", "scanner": "scanner-primary", "fingerprint": "1315d240629c3556", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d1c0b271d316bf8c", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/teams/?mine=1 (web/app/cabinet/page.tsx:303)"}, "properties": {"repobilityId": "7a63deb222bd8b98", "scanner": "scanner-primary", "fingerprint": "d1c0b271d316bf8c", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-07851dd047184aa0", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/workshops/mine/ (web/app/cabinet/page.tsx:311)"}, "properties": {"repobilityId": "82c5bf246ad70e5d", "scanner": "scanner-primary", "fingerprint": "07851dd047184aa0", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-10dfc1c7445d634e", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/billing/me/ (web/app/cabinet/page.tsx:319)"}, "properties": {"repobilityId": "a342ee8c93091f7a", "scanner": "scanner-primary", "fingerprint": "10dfc1c7445d634e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a4885137cda65c5", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/billing/activate/ (web/app/cabinet/page.tsx:337)"}, "properties": {"repobilityId": "ce724867ebcba1dc", "scanner": "scanner-primary", "fingerprint": "1a4885137cda65c5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-03a4ca2d5e0f17cd", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/billing/me/ (web/app/cabinet/page.tsx:343)"}, "properties": {"repobilityId": "068bfb21e26a5e38", "scanner": "scanner-primary", "fingerprint": "03a4ca2d5e0f17cd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-6c60c1eae5da7763", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/auth/me/ (web/app/cabinet/page.tsx:344)"}, "properties": {"repobilityId": "9cb899174e5e2e95", "scanner": "scanner-primary", "fingerprint": "6c60c1eae5da7763", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5b871328ed50d5dc", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/workshops/mine/ (web/app/cabinet/page.tsx:349)"}, "properties": {"repobilityId": "c2d385e273a9ea76", "scanner": "scanner-primary", "fingerprint": "5b871328ed50d5dc", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-51eaa5e20347c608", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:376)"}, "properties": {"repobilityId": "cab790c6a9fb1f56", "scanner": "scanner-primary", "fingerprint": "51eaa5e20347c608", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59c9c2c249004e4e", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:393)"}, "properties": {"repobilityId": "3d497119de1cc819", "scanner": "scanner-primary", "fingerprint": "59c9c2c249004e4e", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a1919416feef2079", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:409)"}, "properties": {"repobilityId": "29b8966fc8b02ddd", "scanner": "scanner-primary", "fingerprint": "a1919416feef2079", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-5aac6b3973e35788", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:426)"}, "properties": {"repobilityId": "f99a47afbf6675fa", "scanner": "scanner-primary", "fingerprint": "5aac6b3973e35788", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-655caa3458169bca", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/auth/me/ (web/app/cabinet/page.tsx:438)"}, "properties": {"repobilityId": "291173aff02d5174", "scanner": "scanner-primary", "fingerprint": "655caa3458169bca", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-01b169552d002d40", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/orders/${orderId}/review/ (web/app/cabinet/page.tsx:447)"}, "properties": {"repobilityId": "712314da5d731238", "scanner": "scanner-primary", "fingerprint": "01b169552d002d40", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-0b5a6809af8b2ed7", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/orders/incoming/${orderId}/ (web/app/cabinet/page.tsx:460)"}, "properties": {"repobilityId": "e24409a1ff17e1ec", "scanner": "scanner-primary", "fingerprint": "0b5a6809af8b2ed7", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1c1b717341d59454", "level": "error", "message": {"text": "Dangling fetch: PATCH /api/v1/listings/${id}/ (web/app/cabinet/page.tsx:520)"}, "properties": {"repobilityId": "752f3e87581de3cd", "scanner": "scanner-primary", "fingerprint": "1c1b717341d59454", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-59e10ed1bcdd0fb2", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/${kind}/ (web/app/cabinet/page.tsx:535)"}, "properties": {"repobilityId": "b9e4c584f892f3a7", "scanner": "scanner-primary", "fingerprint": "59e10ed1bcdd0fb2", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-d4320e278d5ecacd", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/auth/${kind}/ (web/app/cabinet/page.tsx:551)"}, "properties": {"repobilityId": "63f8afbada1fd40e", "scanner": "scanner-primary", "fingerprint": "d4320e278d5ecacd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-864e4de21b2cbbc5", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/listings/${id}/ (web/app/cabinet/page.tsx:560)"}, "properties": {"repobilityId": "e51a7efd51a6952f", "scanner": "scanner-primary", "fingerprint": "864e4de21b2cbbc5", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-b9bb87c3fcd4289a", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/listings/public/ (web/app/cabinet/page.tsx:568)"}, "properties": {"repobilityId": "be34e54337325565", "scanner": "scanner-primary", "fingerprint": "b9bb87c3fcd4289a", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-9498ce2ea1aa3838", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/profiles/me/photos/ (web/app/cabinet/page.tsx:584)"}, "properties": {"repobilityId": "04d4477bbc036f76", "scanner": "scanner-primary", "fingerprint": "9498ce2ea1aa3838", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f47da4bfcc4eb1bd", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/profiles/me/photos/${id}/ (web/app/cabinet/page.tsx:592)"}, "properties": {"repobilityId": "0a6db7aedca17428", "scanner": "scanner-primary", "fingerprint": "f47da4bfcc4eb1bd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ca330bea7218f9db", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/looks/ (web/app/cabinet/page.tsx:608)"}, "properties": {"repobilityId": "548aac03adafb130", "scanner": "scanner-primary", "fingerprint": "ca330bea7218f9db", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ce21b4c7358b57b3", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/looks/${id}/ (web/app/cabinet/page.tsx:616)"}, "properties": {"repobilityId": "d73c45a9f93d335e", "scanner": "scanner-primary", "fingerprint": "ce21b4c7358b57b3", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c1ed045523f0df49", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/products/ (web/app/cabinet/page.tsx:633)"}, "properties": {"repobilityId": "2873f52c41066525", "scanner": "scanner-primary", "fingerprint": "c1ed045523f0df49", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c4cc53d70e763539", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/products/${id}/ (web/app/cabinet/page.tsx:644)"}, "properties": {"repobilityId": "6decc9e9941bc8e3", "scanner": "scanner-primary", "fingerprint": "c4cc53d70e763539", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-7b4dd0d4fe6eef32", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/slots/ (web/app/cabinet/page.tsx:659)"}, "properties": {"repobilityId": "ea706c245b146e24", "scanner": "scanner-primary", "fingerprint": "7b4dd0d4fe6eef32", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-803788a54c59d91f", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/slots/${id}/ (web/app/cabinet/page.tsx:673)"}, "properties": {"repobilityId": "eff14497e3b9641a", "scanner": "scanner-primary", "fingerprint": "803788a54c59d91f", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-c496d17c8f85d615", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/bookings/${bookingId}/ (web/app/cabinet/page.tsx:679)"}, "properties": {"repobilityId": "c354abf8b10c4a27", "scanner": "scanner-primary", "fingerprint": "c496d17c8f85d615", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-4ac4ac8250fb6462", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/workshops/ (web/app/cabinet/page.tsx:701)"}, "properties": {"repobilityId": "15238f7b6d4adf7b", "scanner": "scanner-primary", "fingerprint": "4ac4ac8250fb6462", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-ff7cf190889f97ad", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/workshops/${id}/ (web/app/cabinet/page.tsx:726)"}, "properties": {"repobilityId": "e4e367d3eebeadec", "scanner": "scanner-primary", "fingerprint": "ff7cf190889f97ad", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f0de4808d05ffd39", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/workshops/${wsId}/photos/ (web/app/cabinet/page.tsx:734)"}, "properties": {"repobilityId": "9fb27d3fd4b9cf89", "scanner": "scanner-primary", "fingerprint": "f0de4808d05ffd39", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-1a9f8b82c47309cd", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/workshops/${wsId}/photos/${photoId}/ (web/app/cabinet/page.tsx:742)"}, "properties": {"repobilityId": "2d56577cefeb9a16", "scanner": "scanner-primary", "fingerprint": "1a9f8b82c47309cd", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a5c01bb292def2e4", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/follow/${userId}/ (web/app/cabinet/page.tsx:749)"}, "properties": {"repobilityId": "56e9814c64d779e8", "scanner": "scanner-primary", "fingerprint": "a5c01bb292def2e4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-77c3ce7286023ac6", "level": "error", "message": {"text": "Dangling fetch: DELETE /api/v1/favorites/${kind}/${objectId}/ (web/app/cabinet/page.tsx:754)"}, "properties": {"repobilityId": "e37ebc9c1e3cde80", "scanner": "scanner-primary", "fingerprint": "77c3ce7286023ac6", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-eec6503b02a86273", "level": "error", "message": {"text": "Dangling fetch: GET /api/v1/profiles/fan-matches/ (web/app/cabinet/page.tsx:761)"}, "properties": {"repobilityId": "8265c08b03f8903e", "scanner": "scanner-primary", "fingerprint": "eec6503b02a86273", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-741679e32c591133", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/follow/${userId}/ (web/app/cabinet/page.tsx:768)"}, "properties": {"repobilityId": "c497c3512de6f412", "scanner": "scanner-primary", "fingerprint": "741679e32c591133", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-192781ab035e04f4", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/change-password/ (web/app/cabinet/page.tsx:778)"}, "properties": {"repobilityId": "c2ff78863d1603f6", "scanner": "scanner-primary", "fingerprint": "192781ab035e04f4", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-3320b1cb2264f914", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/change-email/ (web/app/cabinet/page.tsx:793)"}, "properties": {"repobilityId": "6086d72b1a9619df", "scanner": "scanner-primary", "fingerprint": "3320b1cb2264f914", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-a60de197e2e04090", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/change-email/confirm/ (web/app/cabinet/page.tsx:807)"}, "properties": {"repobilityId": "a9cd63976a34d641", "scanner": "scanner-primary", "fingerprint": "a60de197e2e04090", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-67efad2c4c5c6603", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/delete-account/ (web/app/cabinet/page.tsx:823)"}, "properties": {"repobilityId": "1e39f980a78b7279", "scanner": "scanner-primary", "fingerprint": "67efad2c4c5c6603", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-f79578c17d130653", "level": "error", "message": {"text": "Dangling fetch: POST /api/v1/auth/logout/ (web/app/cabinet/page.tsx:2320)"}, "properties": {"repobilityId": "cee0615af49c98df", "scanner": "scanner-primary", "fingerprint": "f79578c17d130653", "layer": "api", "severity": "high", "confidence": 1.0, "tags": ["wiring", "dangling-fetch", "fetch"]}}, {"ruleId": "scanner-676f12e4b7455e41", "level": "note", "message": {"text": "Unused endpoint: ANY /stats/"}, "properties": {"repobilityId": "3173ac9cad075184", "scanner": "scanner-primary", "fingerprint": "676f12e4b7455e41", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a9d6417e8feb9dc", "level": "note", "message": {"text": "Unused endpoint: ANY /search/"}, "properties": {"repobilityId": "af44a23a2bbc7a2d", "scanner": "scanner-primary", "fingerprint": "2a9d6417e8feb9dc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c940aa311a121ee5", "level": "note", "message": {"text": "Unused endpoint: ANY /analytics/me/"}, "properties": {"repobilityId": "c33e7085606ff924", "scanner": "scanner-primary", "fingerprint": "c940aa311a121ee5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c6fb489d0ea4171b", "level": "note", "message": {"text": "Unused endpoint: ANY /feed/"}, "properties": {"repobilityId": "d3f9494656cac72d", "scanner": "scanner-primary", "fingerprint": "c6fb489d0ea4171b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ce2b53a5ca6f724d", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/"}, "properties": {"repobilityId": "86cb4222b14577c3", "scanner": "scanner-primary", "fingerprint": "ce2b53a5ca6f724d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1a6d91f2236825bf", "level": "note", "message": {"text": "Unused endpoint: ANY /"}, "properties": {"repobilityId": "335ac3502dbe9dd9", "scanner": "scanner-primary", "fingerprint": "1a6d91f2236825bf", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a47187ad6c58d81", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/"}, "properties": {"repobilityId": "fc01519cc06a4adc", "scanner": "scanner-primary", "fingerprint": "2a47187ad6c58d81", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cfb96e446d4a0e40", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-roles/"}, "properties": {"repobilityId": "a8ffce9dd2bfadfc", "scanner": "scanner-primary", "fingerprint": "cfb96e446d4a0e40", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f08592a7ae3a737f", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-staff/"}, "properties": {"repobilityId": "6e2f23dc8f061e70", "scanner": "scanner-primary", "fingerprint": "f08592a7ae3a737f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3d4f5ee69be527f8", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/set-active/"}, "properties": {"repobilityId": "a3d7774558735fdd", "scanner": "scanner-primary", "fingerprint": "3d4f5ee69be527f8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4ed8ea1aa40c08f3", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/delete/"}, "properties": {"repobilityId": "efd6f3426e334b69", "scanner": "scanner-primary", "fingerprint": "4ed8ea1aa40c08f3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c7a566431649fd1d", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/reset-password/"}, "properties": {"repobilityId": "f6fedab86fc52802", "scanner": "scanner-primary", "fingerprint": "c7a566431649fd1d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5a0cf2e98830d21f", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/subscriptions/"}, "properties": {"repobilityId": "c9374dda767e495c", "scanner": "scanner-primary", "fingerprint": "5a0cf2e98830d21f", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-ae2fdd1d1dc221a9", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/subscriptions/<int:target_id>/"}, "properties": {"repobilityId": "6a95b12839449e69", "scanner": "scanner-primary", "fingerprint": "ae2fdd1d1dc221a9", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-46269bad8e8fc0e3", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/invites/"}, "properties": {"repobilityId": "13a9f366a6a1da5b", "scanner": "scanner-primary", "fingerprint": "46269bad8e8fc0e3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-48a65551ecd12bed", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/invites/<int:pk>/"}, "properties": {"repobilityId": "da7b2e7038e23631", "scanner": "scanner-primary", "fingerprint": "48a65551ecd12bed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-1efb30f88f11b794", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/stats/"}, "properties": {"repobilityId": "bdd69524c532e674", "scanner": "scanner-primary", "fingerprint": "1efb30f88f11b794", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e3caf39cb2c101a8", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/workshops/"}, "properties": {"repobilityId": "b8cd0a648d3fc749", "scanner": "scanner-primary", "fingerprint": "e3caf39cb2c101a8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-5938fb9d534f49b2", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/workshops/<int:pk>/delete/"}, "properties": {"repobilityId": "6d2086510213c389", "scanner": "scanner-primary", "fingerprint": "5938fb9d534f49b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-cef0fcf39a8897b8", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/workshops/<int:pk>/"}, "properties": {"repobilityId": "5b68b526fcb5d1f8", "scanner": "scanner-primary", "fingerprint": "cef0fcf39a8897b8", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-daa9016f2692a0fb", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/workshops/"}, "properties": {"repobilityId": "1f61835333732b5e", "scanner": "scanner-primary", "fingerprint": "daa9016f2692a0fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-e43e0d4bef9a6b95", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/photos/"}, "properties": {"repobilityId": "d8d0e28f27be0e61", "scanner": "scanner-primary", "fingerprint": "e43e0d4bef9a6b95", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9e54cc3994eaaeed", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/photos/<int:photo_id>/"}, "properties": {"repobilityId": "8de4bef8c5df00b4", "scanner": "scanner-primary", "fingerprint": "9e54cc3994eaaeed", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-235e0352e64e46a5", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/listings/"}, "properties": {"repobilityId": "9bc9d26f9e3a2110", "scanner": "scanner-primary", "fingerprint": "235e0352e64e46a5", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a8e9956bddcd0996", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/set-active/"}, "properties": {"repobilityId": "cd2f202aefc36bb0", "scanner": "scanner-primary", "fingerprint": "a8e9956bddcd0996", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-c1968a3801ad4fef", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/update/"}, "properties": {"repobilityId": "ab17966c28323645", "scanner": "scanner-primary", "fingerprint": "c1968a3801ad4fef", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-97bd0b49fecfb483", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/listings/<int:pk>/delete/"}, "properties": {"repobilityId": "7ef30446a14d9a7a", "scanner": "scanner-primary", "fingerprint": "97bd0b49fecfb483", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-933b8011e6107c3c", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/products/"}, "properties": {"repobilityId": "6dc116d47a43fff7", "scanner": "scanner-primary", "fingerprint": "933b8011e6107c3c", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-583c355a2fbe8621", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/products/"}, "properties": {"repobilityId": "12b25331213a442f", "scanner": "scanner-primary", "fingerprint": "583c355a2fbe8621", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-446950ed24ddcfa6", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/products/<int:pk>/set-active/"}, "properties": {"repobilityId": "fffeac2c3f81bfc3", "scanner": "scanner-primary", "fingerprint": "446950ed24ddcfa6", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f227858f4efad11d", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/products/<int:pk>/update/"}, "properties": {"repobilityId": "967ecb4dadb6b170", "scanner": "scanner-primary", "fingerprint": "f227858f4efad11d", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-f6aef989085d6d0a", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/products/<int:pk>/delete/"}, "properties": {"repobilityId": "0a166cc7ecfcebc2", "scanner": "scanner-primary", "fingerprint": "f6aef989085d6d0a", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-d1e7830cbf8f7331", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/users/<int:pk>/slots/"}, "properties": {"repobilityId": "bf56ab658ee79a87", "scanner": "scanner-primary", "fingerprint": "d1e7830cbf8f7331", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-a5abd54993af42f2", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/slots/<int:pk>/"}, "properties": {"repobilityId": "bc541d424ae91955", "scanner": "scanner-primary", "fingerprint": "a5abd54993af42f2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-4e9d335fdb75a3fb", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/orders/"}, "properties": {"repobilityId": "f093698fdb91ee15", "scanner": "scanner-primary", "fingerprint": "4e9d335fdb75a3fb", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-bc5a5a0b58a46ba3", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/orders/<int:pk>/set-status/"}, "properties": {"repobilityId": "192d61cead8badc5", "scanner": "scanner-primary", "fingerprint": "bc5a5a0b58a46ba3", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-455f05635635acb7", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/subscriptions/"}, "properties": {"repobilityId": "b5a2aa199a4ad31a", "scanner": "scanner-primary", "fingerprint": "455f05635635acb7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-97f8aed629ee8aba", "level": "note", "message": {"text": "Unused endpoint: ANY /admin-panel/subscriptions/<int:pk>/"}, "properties": {"repobilityId": "aa26b349925749cf", "scanner": "scanner-primary", "fingerprint": "97f8aed629ee8aba", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-74fa90f3eaebb0b0", "level": "note", "message": {"text": "Unused endpoint: ANY /schema/"}, "properties": {"repobilityId": "0244367bbf10f4e8", "scanner": "scanner-primary", "fingerprint": "74fa90f3eaebb0b0", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-192a68a6069f2ab7", "level": "note", "message": {"text": "Unused endpoint: ANY /docs/"}, "properties": {"repobilityId": "6ecc1c5d7a343c54", "scanner": "scanner-primary", "fingerprint": "192a68a6069f2ab7", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7309bf2446873ccc", "level": "note", "message": {"text": "Unused endpoint: ANY /admin/"}, "properties": {"repobilityId": "1d47feb43791c5ac", "scanner": "scanner-primary", "fingerprint": "7309bf2446873ccc", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-eaeb186e445cb4b2", "level": "note", "message": {"text": "Unused endpoint: ANY /api/v1/"}, "properties": {"repobilityId": "b00f73ed7fdb0485", "scanner": "scanner-primary", "fingerprint": "eaeb186e445cb4b2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-81f7517bb8f42c00", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/register/"}, "properties": {"repobilityId": "56c6a6fdc128af7f", "scanner": "scanner-primary", "fingerprint": "81f7517bb8f42c00", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-3ad71917023127ab", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/invite-check/"}, "properties": {"repobilityId": "8d4459a532f1d69e", "scanner": "scanner-primary", "fingerprint": "3ad71917023127ab", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2517dae61e646158", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/login/"}, "properties": {"repobilityId": "5db793332ef0efad", "scanner": "scanner-primary", "fingerprint": "2517dae61e646158", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-aeeb94f5cc9f0484", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/logout/"}, "properties": {"repobilityId": "0098a1ecec88392b", "scanner": "scanner-primary", "fingerprint": "aeeb94f5cc9f0484", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-2a241041138d3e68", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/me/"}, "properties": {"repobilityId": "bb477eab6b02d8e1", "scanner": "scanner-primary", "fingerprint": "2a241041138d3e68", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-188e4699d9e268a2", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/change-password/"}, "properties": {"repobilityId": "5d860585a0874915", "scanner": "scanner-primary", "fingerprint": "188e4699d9e268a2", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-9eb84d8d4da2b383", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/change-email/"}, "properties": {"repobilityId": "cdee2020e2c20044", "scanner": "scanner-primary", "fingerprint": "9eb84d8d4da2b383", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}, {"ruleId": "scanner-7e5c79092699355b", "level": "note", "message": {"text": "Unused endpoint: ANY /auth/change-email/confirm/"}, "properties": {"repobilityId": "75f581f992f1acfd", "scanner": "scanner-primary", "fingerprint": "7e5c79092699355b", "layer": "api", "severity": "low", "confidence": 1.0, "tags": ["wiring", "unused-endpoint"]}}]}]}