{"2fa": [{"path": "/2fa/backup-codes", "function": "mobile_2fa_backup_codes_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get 2FA backup codes for mobile.", "Returns": "{ ok: True, codes: [ ... ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.119719Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"2fa_not_enabled\",\"message\":\"2FA not enabled\",\"ok\":false}\n"}, "request_example": {"user": "test"}}, {"path": "/2fa/backup-codes/regenerate", "function": "mobile_2fa_backup_codes_regen", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Regenerate 2FA backup codes.", "Returns": "codes", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.125475Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"2fa_not_enabled\",\"message\":\"2FA not enabled\",\"ok\":false}\n"}, "request_example": {"user": "test"}}, {"path": "/api/mobile/2fa/enable", "function": "mobile_2fa_enable", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Enable 2FA for mobile user.", "Returns": "already_enabled", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.133436Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"provisioning_uri\":\"otpauth://totp/TCGTraders.app:EXAMPLE?secret=REDACTED&issuer=TCGTraders.app\",\"secret\":\"REDACTED\"}\n"}, "path_original": "/2fa/enable"}, {"path": "/api/mobile/2fa/status", "function": "mobile_2fa_status", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Check 2FA status for mobile user.", "Returns": "two_factor_enabled", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.135841Z", "status_code": 200, "ok": true, "response_snippet": "{\"backup_codes\":0,\"has_secret\":true,\"ok\":true,\"two_factor_enabled\":false}\n"}, "path_original": "/2fa/status"}, {"path": "/2fa/verify", "function": "mobile_2fa_verify", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Verify 2FA code for mobile user.", "Returns": "activated", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.141057Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"code_required\",\"message\":\"Code required\",\"ok\":false}\n"}, "request_example": {"user": "test", "code": "test"}}], "achievements": [{"path": "/api/mobile/achievements/list", "function": "mobile_achievements_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "List user achievements for mobile app.", "Returns": "{ ok: True, achievements: [ { id, name, points } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.145871Z", "status_code": 200, "ok": true, "response_snippet": "{\"achievements\":[{\"badge_color\":\"success\",\"category\":\"getting_started\",\"description\":\"Complete your first login to the trading platform\",\"earned\":false,\"icon\":\"fas fa-hand-wave\",\"id\":1,\"name\":\"Welcome Aboard!\",\"points\":10},{\"badge_color\":\"info\",\"category\":\"getting_started\",\"description\":\"Complete your profile with bio, location, and trading focus\",\"earned\":false,\"icon\":\"fas fa-user-edit\",\"id\":2,\"name\":\"Profile Master\",\"points\":25},{\"badge_color\":\"primary\",\"category\":\"collecting\",\"description\":\"Add your first card to your inventory\",\"earned\":true,\"icon\":\"fas fa-plus-circle\",\"id\":3,\"name\":\"First Steps\",\"points\":15},{\"badge_color\":\"success\",\"category\":\"trading\",\"description\":\"Complete your first successful trade\",\"earned\":false,\"icon\":\"fas fa-handshake\",\"id\":4,\"name\":\"First Deal\",\"points\":50},{\"badge_color\":\"warning\",\"category\":\"trading\",\"description\":\"Complete 10 successful trades\",\"earned\":false,\"icon\":\"fas fa-exchange-alt\",\"id\":5,\"name\":\"Veteran Trader\",\"points\":100},{\"badge_color\":\"warning\",\"category\":\"trading\",\"description\":\"Complete 50 successful trades\",\"earned\":false,\"icon\":\"fas fa-crown\",\"id\":6,\"name\":\"Trading Master\",\"points\":250},{\"badge_color\":\"info\",\"category\":\"collecting\",\"description\":\"Build an inventory of 100 cards\",\"earned\":false,\"icon\":\"fas fa-archive\",\"id\":7,\"name\":\"Collector\",\"points\":75},{\"badge_color\":\"info\",\"category\":\"collecting\",\"description\":\"Build an inventory of 500 cards\",\"earned\":false,\"icon\":\"fas fa-boxes\",\"id\":8,\"name\":\"Serious Collector\",\"points\":150},{\"badge_color\":\"warning\",\"category\":\"premium\",\"description\":\"Become a Premium member\",\"earned\":true,\"icon\":\"fas fa-gem\",\"id\":9,\"name\":\"VIP Member\",\"points\":100}],\"ok\":true}\n"}, "path_original": "/achievements/list"}, {"path": "/api/mobile/achievements/summary", "function": "mobile_achievements_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, achievements: [ { id, name, progress } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.156973Z", "status_code": 200, "ok": true, "response_snippet": "{\"achievements\":{\"earned\":2,\"percent_complete\":22.2,\"recent\":[{\"badge_color\":\"warning\",\"earned_at\":\"2025-10-25T23:47:42.071138\",\"icon\":\"fas fa-gem\",\"id\":9,\"name\":\"VIP Member\",\"points\":100},{\"badge_color\":\"primary\",\"earned_at\":\"2025-10-25T22:28:33.222821\",\"icon\":\"fas fa-plus-circle\",\"id\":3,\"name\":\"First Steps\",\"points\":15}],\"total\":9},\"ok\":true}\n"}, "path_original": "/achievements/summary"}], "admin": [{"path": "/api/mobile/admin/analytics", "function": "mobile_admin_analytics", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, metrics: { users, sessions, errors } } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.171497Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"api_requests_today\":0,\"daily_active_users\":0,\"database_size\":\"0MB\",\"error_rate\":\"0%\",\"monthly_revenue\":0,\"server_uptime\":\"99.9%\",\"storage_used\":\"0%\",\"total_inventory_items\":29,\"total_trades\":0,\"total_users\":6},\"ok\":true}\n"}, "path_original": "/admin/analytics"}, {"path": "/api/mobile/admin/content/flagged", "function": "mobile_admin_flagged_content", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, flagged: [ { id, type, reason } ] } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.174407Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"content\":[]},\"ok\":true}\n"}, "path_original": "/admin/content/flagged"}, {"path": "/api/mobile/admin/dashboard", "function": "mobile_admin_dashboard", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, dashboard: { jobs, flags, recent_reports } } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.177770Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"content_management\":{\"flagged_content\":0,\"pending_reports\":0,\"total_inventory_items\":29},\"system_status\":{\"database_status\":\"connected\",\"last_backup\":null,\"server_status\":\"online\"},\"user_management\":{\"active_users\":0,\"banned_users\":0,\"total_users\":6}},\"ok\":true}\n"}, "path_original": "/admin/dashboard"}, {"path": "/admin/jobs", "function": "mobile_admin_jobs", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get machine-readable API documentation in JSON format.", "Returns": "{ ok: True, jobs: [ { id, name, status, started_at } ] } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.536017Z", "status_code": 200, "ok": true, "response_snippet": "﻿<!DOCTYPE html>\n<html lang=\"en\" data-bs-theme=\"dark\" >\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-cache, no-store, must-revalidate\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n    <title>Background Jobs</title>\n    \n    <!-- Bootstrap CSS -->\n    <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <!-- Font Awesome -->\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">\n    <!-- Custom CSS with cache busting -->\n    <link rel=\"stylesheet\" href=\"/static/css/style.css?v=20250901c\">\n    <link rel=\"stylesheet\" href=\"/static/css/tcg-dark-theme.css?v=20250817b\">\n    <style>\n    /* PRO badge: single smooth yellow→pink gradient, gem icon */\n    .badge-pro {\n        display: inline-flex;\n        align-items: center;\n        gap: 0.35rem;\n        background: linear-gradient(90deg, #ff69b4 0%, #ffd700 100%);\n        color: #000000;\n        font-weight: 700;\n        font-size: 0.75rem;\n        padding: 0.25rem 0.6rem;\n        border-radius: 0.375rem;\n        letter-spacing: 0.02em;\n        line-height: 1;\n        background-clip: padding-box;\n        border: none;\n        vertical-align: middle;\n    }\n\n    .badge-pro .fa-gem {\n        font-size: 0.85em;\n        line-height: 1;\n        color: #000000;\n    }\n\n    /* Lifetime badge: solid yellow, white text, gem on each side */\n    .badge-lifetime {\n        display: inline-flex;\n        align-items: center;\n        gap: 0.35rem;\n        background: #ffd700;\n        color: #fff;\n        font-weight: 700;\n        font-size: 0.75rem;\n        padding: 0.25rem 0.6rem;\n        border-radius: 0.375rem;\n        letter-spacing: 0.02em;\n        line-height: 1;\n        box-shadow: 0 4px 18px rgba(0,0,0,0.22), i..."}}, {"path": "/api/mobile/admin/reports", "function": "mobile_admin_reports", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, reports: [ { id, title, status } ] } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.538834Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"reports\":[]},\"ok\":true}\n"}, "path_original": "/admin/reports"}, {"path": "/api/mobile/admin/roles", "function": "mobile_admin_roles", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, roles: [ { id, name, permissions } ] } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.544216Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"admins\":[{\"email\":\"redacted@example.com\",\"granted_at\":\"2025-09-05T10:11:20.868992\",\"id\":2,\"role\":\"super_admin\",\"username\":\"Kairi\"},{\"email\":\"\",\"granted_at\":\"2025-10-25T21:56:50.308818\",\"id\":7,\"role\":\"super_admin\",\"username\":\"api_test_user\"}]},\"ok\":true}\n"}, "path_original": "/admin/roles"}, {"path": "/api/mobile/admin/system/maintenance", "function": "mobile_admin_toggle_maintenance", "admin": true, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, maintenance_enabled: True|False } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.546531Z", "status_code": 200, "ok": true, "response_snippet": "{\"message\":\"Maintenance mode setting updated\",\"ok\":true}\n"}, "path_original": "/admin/system/maintenance"}, {"path": "/api/mobile/admin/system/registration", "function": "mobile_admin_toggle_registration", "admin": true, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, registration_open: True|False } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.548894Z", "status_code": 200, "ok": true, "response_snippet": "{\"message\":\"Registration setting updated\",\"ok\":true}\n"}, "path_original": "/admin/system/registration"}, {"path": "/api/mobile/admin/system/trading", "function": "mobile_admin_toggle_trading", "admin": true, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, trades: [ { id, summary } ], filters?: { games, sets } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.551173Z", "status_code": 200, "ok": true, "response_snippet": "{\"message\":\"Trading system setting updated\",\"ok\":true}\n"}, "path_original": "/admin/system/trading"}, {"path": "/api/mobile/admin/trades", "function": "mobile_admin_trades", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Manage or list trades.", "Returns": "{ ok: True, trades: [ { id, status, user } ] } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.553406Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"trades\":[]},\"ok\":true}\n"}, "path_original": "/admin/trades"}, {"path": "/api/mobile/admin/users", "function": "mobile_admin_users", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, users: [ { id, username, banned? } ] } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.559855Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"has_next\":false,\"page\":1,\"per_page\":50,\"total\":6,\"users\":[{\"email\":\"redacted@example.com\",\"id\":8,\"is_verified\":false,\"last_login\":null,\"registration_date\":\"2025-10-25T22:19:45.263508\",\"trade_count\":0,\"username\":\"api_test_partner\"},{\"email\":\"\",\"id\":7,\"is_verified\":false,\"last_login\":null,\"registration_date\":\"2025-10-25T21:56:50.308818\",\"trade_count\":0,\"username\":\"api_test_user\"},{\"email\":\"redacted@example.com\",\"id\":6,\"is_verified\":false,\"last_login\":null,\"registration_date\":\"2025-10-14T14:51:39.390047\",\"trade_count\":0,\"username\":\"GoogleUserCreationTest\"},{\"email\":\"redacted@example.com\",\"id\":5,\"is_verified\":false,\"last_login\":null,\"registration_date\":\"2025-09-09T02:32:06.856388\",\"trade_count\":0,\"username\":\"cavelepus\"},{\"email\":\"redacted@example.com\",\"id\":3,\"is_verified\":false,\"last_login\":null,\"registration_date\":\"2025-09-05T14:54:56.126355\",\"trade_count\":0,\"username\":\"tester\"},{\"email\":\"redacted@example.com\",\"id\":2,\"is_verified\":false,\"last_login\":null,\"registration_date\":\"2025-09-05T10:11:20.868992\",\"trade_count\":0,\"username\":\"Kairi\"}]},\"ok\":true}\n"}, "path_original": "/admin/users"}, {"path": "/admin/users/<int:user_id>/ban", "function": "mobile_admin_ban_user", "admin": true, "premium": false, "Method": "POST", "Arguments": ["current_user", "user_id"], "Description": "Query database and return results.", "Returns": "message", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.568230Z", "status_code": 404, "ok": false, "response_snippet": "<!doctype html>\n<html lang=en>\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>\n"}, "request_example": {"user": "test"}}, {"path": "/admin/users/<int:user_id>/unban", "function": "mobile_admin_unban_user", "admin": true, "premium": false, "Method": "POST", "Arguments": ["current_user", "user_id"], "Description": "Query database and return results.", "Returns": "message", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.576427Z", "status_code": 404, "ok": false, "response_snippet": "<!doctype html>\n<html lang=en>\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>\n"}, "request_example": {"user": "test"}}, {"path": "/api/mobile/admin/users/banned", "function": "mobile_admin_banned_users", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, users: [ { id, username, ban_reason } ] } (admin only)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.578999Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"users\":[]},\"ok\":true}\n"}, "path_original": "/admin/users/banned"}], "alerts": [{"path": "/api/mobile/alerts/unread", "function": "mobile_alerts_unread", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "", "Returns": "{ ok: True, alerts: [ { id, type, message, created_at } ], total: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.584774Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"unread\":2}\n"}, "path_original": "/alerts/unread"}], "cards": [{"path": "/cards/detail", "function": "mobile_card_detail", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get detailed card information for mobile.", "Returns": "{ ok: True, card: { productId, name, images: [...], prices: {...} } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.588689Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"id_required\",\"ok\":false}\n"}, "request_example": {"unique_id": 1, "card": "test", "product_id": 1}}, {"path": "/cards/export", "function": "mobile_cards_export", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Export cards data for mobile user.", "Returns": "{ ok: True, download_url, meta: { total_rows } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.595485Z", "status_code": 503, "ok": false, "response_snippet": "{\"error\":\"export_unavailable\",\"ok\":false}\n"}, "request_example": {"built": "test"}}, {"path": "/cards/export/meta", "function": "mobile_cards_export_meta", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get metadata for card export functionality.", "Returns": "{ ok: True, meta: { columns, total_rows } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.599408Z", "status_code": 503, "ok": false, "response_snippet": "{\"error\":\"export_unavailable\",\"ok\":false}\n"}, "request_example": {"built": "test"}}, {"path": "/cards/image/debug", "function": "mobile_images_manifest", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "", "Returns": "count, error, game, last_modified, ok, product_ids", "Other notes": "Requires authentication.Rate-limited.", "last_test": {"tested_at": "2025-10-26T01:11:23.603360Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"product_id_required\",\"ok\":false}\n"}, "request_example": {"pid": 1, "product_id": 1}}, {"path": "/api/mobile/cards/images", "function": "mobile_card_images", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Image bootstrap / manifest endpoints for client caching.", "Returns": "{ ok: True, images: [ { productId, url, quality? } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.605792Z", "status_code": 200, "ok": true, "response_snippet": "{\"images\":{},\"ok\":true}\n"}, "path_original": "/cards/images"}, {"path": "/api/mobile/cards/random", "function": "mobile_random_card", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get detailed information for a specific card by product ID.", "Returns": "{ ok: True, card: { productId, name, image_url } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:23.608207Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"game\":\"Yu-Gi-Oh!\",\"image_url\":\"/static/images/cards/dark_magician.jpg\",\"name\":\"Dark Magician\",\"set\":\"Legend of Blue Eyes\"},\"ok\":true}\n"}, "path_original": "/cards/random"}, {"path": "/api/mobile/cards/store_status", "function": "mobile_card_store_status", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get card store status for mobile.", "Returns": "cards, error, games, loaded, message, ok", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:24.921418Z", "status_code": 200, "ok": true, "response_snippet": "{\"cards\":548199,\"games\":0,\"loaded\":true,\"ok\":true}\n"}, "path_original": "/cards/store_status"}], "changes": [{"path": "/api/mobile/changes", "function": "mobile_changes", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get recent changes for mobile user.", "Returns": "changes, entity, error, has_more, next_since_id, ok", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:24.939295Z", "status_code": 200, "ok": true, "response_snippet": "{\"changes\":[{\"entity\":\"notification\",\"entity_id\":\"1\",\"id\":1,\"op\":\"update\",\"updated_at\":\"2025-10-01T00:54:50.177829Z\"},{\"entity\":\"notification\",\"entity_id\":\"2\",\"id\":2,\"op\":\"update\",\"updated_at\":\"2025-10-01T00:54:50.178117Z\"},{\"entity\":\"notification\",\"entity_id\":\"3\",\"id\":3,\"op\":\"update\",\"updated_at\":\"2025-10-01T00:54:50.178251Z\"},{\"entity\":\"notification\",\"entity_id\":\"5\",\"id\":4,\"op\":\"update\",\"updated_at\":\"2025-10-01T00:54:50.178363Z\"},{\"entity\":\"notification\",\"entity_id\":\"8\",\"id\":5,\"op\":\"update\",\"updated_at\":\"2025-10-01T00:54:50.178470Z\"},{\"entity\":\"trade\",\"entity_id\":\"1\",\"id\":6,\"op\":\"update\",\"updated_at\":\"2025-10-25T23:47:46.716915Z\"},{\"entity\":\"trade\",\"entity_id\":\"1\",\"id\":7,\"op\":\"update\",\"updated_at\":\"2025-10-25T23:49:37.004849Z\"},{\"entity\":\"trade\",\"entity_id\":\"1\",\"id\":8,\"op\":\"update\",\"updated_at\":\"2025-10-25T23:58:29.458469Z\"}],\"entity\":null,\"has_more\":false,\"next_since_id\":8,\"ok\":true}\n"}, "path_original": "/changes"}], "collection": [{"path": "/api/mobile/collection/summary", "function": "mobile_collection_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get collection summary for mobile user.", "Returns": "{ ok: True, summary: { total_items, total_value, top_games: [...] } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:24.950316Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"summary\":{\"for_trade_distinct\":0,\"owned_distinct\":1,\"total_records\":1,\"wanted_distinct\":0}}\n"}, "path_original": "/collection/summary"}], "contact": [{"path": "/api/mobile/contact/info", "function": "mobile_contact_info", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "", "Returns": "email, feature, ok, placeholder", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:24.952640Z", "status_code": 200, "ok": true, "response_snippet": "{\"email\":\"redacted@example.com\",\"feature\":\"contact\",\"ok\":true,\"placeholder\":true}\n"}, "path_original": "/contact/info"}], "data": [{"path": "/api/mobile/data/bootstrap", "function": "mobile_data_bootstrap", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "", "Returns": "json (ok: bool, ...)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:24.954919Z", "status_code": 200, "ok": true, "response_snippet": "{\"games\":[],\"ok\":true,\"rarities\":[],\"sets\":[]}\n"}, "path_original": "/data/bootstrap"}], "db": [{"path": "/api/mobile/db/download", "function": "mobile_db_download", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Database snapshot/version endpoints (admin-only download).", "Returns": "File download (sqlite or zip) or 404", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.520443Z", "status_code": 200, "ok": true, "response_snippet": "<binary 1853547 bytes: 504b03041400000008006ba9595b12fad859e5471c0000c07200120000006d6f62696c655f736e617073686f742e6462ec7d099c1c47757e1f73ecec6a777c89...>"}, "path_original": "/db/download"}, {"path": "/api/mobile/db/version", "function": "mobile_db_version", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Database snapshot/version endpoints (admin-only download).", "Returns": "{ ok: True, version: <str> , generated_at?: <ts> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.592458Z", "status_code": 200, "ok": true, "response_snippet": "{\"db_version\":1761455485,\"download_url\":\"https://localhost/api/mobile/db/download\",\"ok\":true,\"sha256\":\"97a5c8580ab4d2863f2dd54c30bec536410d771e0926bc16b78177ecd96a8dda\",\"size_bytes\":1853547,\"updated_at\":\"2025-10-26T01:11:25.426560Z\"}\n"}, "path_original": "/db/version"}], "dm": [{"path": "/dm/send", "function": "mobile_dm_send", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Send or list direct messages / message threads.", "Returns": "{ ok: True, message_id }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.597000Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"username_and_content_required\",\"message\":\"Recipient username and content required.\",\"ok\":false}\n"}, "request_example": {"username": "api_test_partner", "subject": "Test", "content": "Hello from api_test_user"}}], "friend_requests": [{"path": "/friend_requests/cancel", "function": "mobile_friend_request_cancel", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Cancel friend request from mobile.", "Returns": "error, message, ok", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.601169Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"username_or_id_required\",\"message\":\"username or id required.\",\"ok\":false}\n"}, "request_example": {"id": 2}}, {"path": "/api/mobile/friend_requests/list", "function": "mobile_friend_requests_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "created_at, error, from_id, id, incoming, message, ok, outgoing, status, to_id", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.607153Z", "status_code": 200, "ok": true, "response_snippet": "{\"incoming\":[],\"ok\":true,\"outgoing\":[{\"created_at\":\"2025-10-25T22:27:41.540119Z\",\"from_id\":7,\"id\":2,\"status\":\"pending\",\"to_id\":8}]}\n"}, "path_original": "/friend_requests/list"}, {"path": "/friend_requests/respond", "function": "mobile_friend_request_respond_legacy", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Respond to friend request (legacy).", "Returns": "error, message, ok", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.611341Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"invalid_parameters\",\"message\":\"id and valid action required.\",\"ok\":false}\n"}, "request_example": {"id": 2, "action": "accept"}}, {"path": "/friend_requests/send", "function": "mobile_friend_request_send_legacy", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Send friend request (legacy endpoint).", "Returns": "error, id, message, ok", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.615463Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"username_required\",\"message\":\"Username required.\",\"ok\":false}\n"}, "request_example": {"username": "api_test_partner"}}], "friends": [{"path": "/api/mobile/friends/list", "function": "mobile_friends_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, friends: [ { id, username, avatar_url } ] }", "Other notes": "Requires authentication.Rate-limited.", "last_test": {"tested_at": "2025-10-26T01:11:25.625158Z", "status_code": 200, "ok": true, "response_snippet": "{\"friends\":[{\"avatar\":null,\"id\":8,\"since\":\"2025-10-25T23:57:50.017023\",\"username\":\"api_test_partner\"}],\"has_more\":false,\"limit\":50,\"next_offset\":null,\"offset\":0,\"ok\":true,\"total\":1}\n"}, "path_original": "/friends/list"}, {"path": "/api/mobile/friends/requests", "function": "mobile_friend_requests_list_alt", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get friend requests for mobile user.", "Returns": "direction, has_more, limit, next_offset, offset, requests, status_filter, total", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.631354Z", "status_code": 200, "ok": true, "response_snippet": "{\"direction\":\"all\",\"has_more\":false,\"limit\":50,\"next_offset\":null,\"offset\":0,\"ok\":true,\"requests\":[{\"created_at\":\"2025-10-25T22:27:41.540119\",\"id\":2,\"is_incoming\":false,\"is_outgoing\":true,\"receiver_id\":8,\"sender_id\":7,\"status\":\"pending\"}],\"status_filter\":\"pending\",\"total\":1}\n"}, "path_original": "/friends/requests"}, {"path": "/friends/requests/respond", "function": "mobile_friend_request_respond", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Respond to friend request from mobile.", "Returns": "{ ok: True, status }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.635442Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"invalid_payload\",\"ok\":false}\n"}, "request_example": {"action": "test", "user": "test", "request_id": 1, "fr": "test"}}, {"path": "/friends/requests/send", "function": "mobile_friend_request_send", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Send friend request from mobile.", "Returns": "{ ok: True, request_id }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.639916Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"username_required\",\"message\":\"Username required\",\"ok\":false}\n"}, "request_example": {"user": "test", "username": "test", "target_username": "test", "target": "test"}}, {"path": "/api/mobile/friends/summary", "function": "mobile_friends_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get friends summary for mobile user.", "Returns": "error, friends, ok, outgoing, pending", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.648850Z", "status_code": 200, "ok": true, "response_snippet": "{\"friends\":1,\"ok\":true,\"outgoing\":1,\"pending\":0}\n"}, "path_original": "/friends/summary"}], "health": [{"path": "/api/mobile/health/report", "function": "mobile_health_report", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "Query database and return results.", "Returns": "{ ok: True }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.656545Z", "status_code": 200, "ok": true, "response_snippet": "{\"auth\":true,\"card_store_loaded\":false,\"friends_count\":1,\"ok\":true,\"unread_messages\":0,\"unread_notifications\":2}\n"}, "path_original": "/health/report"}], "images": [{"path": "/api/mobile/images/bootstrap", "function": "mobile_images_bootstrap", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Image bootstrap / manifest endpoints for client caching.", "Returns": "{ ok: True, generated_at, images: [ { path, url, size?, hash? } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.659317Z", "status_code": 200, "ok": true, "response_snippet": "{\"generated_at\":1761441085,\"images\":[],\"ok\":true}\n"}, "path_original": "/images/bootstrap"}, {"path": "/api/mobile/images/prefetch", "function": "mobile_images_prefetch", "admin": false, "premium": false, "Method": "POST", "Arguments": [], "Description": "Image bootstrap / manifest endpoints for client caching.", "Returns": "{ ok: True, jobs_enqueued: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.661539Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"provided\":0,\"requested\":null,\"to_fetch\":{}}\n"}, "path_original": "/images/prefetch"}, {"path": "/api/mobile/images/simple/1", "function": "mobile_card_image_direct", "admin": false, "premium": false, "Method": "GET", "Arguments": ["product_id"], "Description": "Image bootstrap / manifest endpoints for client caching.", "Returns": "file (attachment)", "Other notes": "", "last_test": {"tested_at": "2025-10-26T01:11:25.664268Z", "status_code": 200, "ok": true, "response_snippet": "{\"direct_url\":\"/api/mobile/cards/image/direct/1\",\"extension\":\"jpg\",\"filename\":\"1.jpg\",\"ok\":true,\"product_id\":\"1\",\"quality\":\"LQ\",\"size\":29,\"url_https\":\"https://localhost/static/LQ/1.jpg\"}\n"}, "path_original": "/images/simple/<product_id>"}], "import": [{"path": "/api/mobile/import/status", "function": "mobile_import_status", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, jobs: [...] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.666543Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"last_import\":{\"count\":250,\"date\":\"2025-09-15\",\"status\":\"completed\"}},\"ok\":true}\n"}, "path_original": "/import/status"}, {"path": "/import/tcgcsv", "function": "mobile_import_tcgcsv", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, job_id } or error", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.670456Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"missing_url\",\"message\":\"Import URL is required\",\"ok\":false}\n"}, "request_example": {"url": "https://example.com/import.csv"}}], "inventory": [{"path": "/inventory/add", "function": "mobile_inventory_add_intercept", "admin": false, "premium": true, "Method": "POST", "Arguments": ["current_user"], "Description": "Add items to user inventory.", "Returns": "{ ok: True, item_id }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.679520Z", "status_code": 400, "ok": false, "response_snippet": "{\"message\":\"UniqueID required\",\"success\":false}\n"}, "request_example": {"unique_id": "1", "quantity": 1, "condition": "Near Mint"}}, {"path": "/api/mobile/inventory/import/status", "function": "mobile_inventory_import_status", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "Inventory/Wishlist related endpoint: /inventory/import/status", "Returns": "{ ok: True, jobs: [...] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.681864Z", "status_code": 200, "ok": true, "response_snippet": "{\"feature\":\"inventory_import_status\",\"jobs\":[],\"ok\":true,\"placeholder\":true}\n"}, "path_original": "/inventory/import/status"}, {"path": "/inventory/item/update", "function": "mobile_inventory_item_update", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Inventory/Wishlist related endpoint: /inventory/item/update", "Returns": "{ ok: True, updated_item: { id, qty, condition } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.685814Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"id_required\",\"ok\":false}\n"}, "request_example": {"id": 316, "owned": 1}}, {"path": "/api/mobile/inventory/items", "function": "mobile_inventory_items", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get mobile inventory items.", "Returns": "{ ok: True, items: [ { id, unique_id, quantity, condition } ], total: <int> }", "Other notes": "Requires authentication.Rate-limited.", "last_test": {"tested_at": "2025-10-26T01:11:25.692422Z", "status_code": 200, "ok": true, "response_snippet": "{\"count\":1,\"has_more\":false,\"items\":[{\"for_trade\":0,\"game\":\"Unknown Game\",\"id\":316,\"image_url\":null,\"name\":\"1\",\"owned\":1,\"productId\":\"1\",\"rarity\":\"Unknown\",\"set\":\"Unknown Set\",\"unique_id\":\"1\",\"updated_at\":\"2025-10-25T22:27:41.480570\",\"wanted\":0}],\"limit\":50,\"next_offset\":null,\"offset\":0,\"ok\":true,\"total\":1}\n"}, "path_original": "/inventory/items"}, {"path": "/api/mobile/inventory/list", "function": "mobile_inventory_list_alias", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Return paginated list of items for the user.", "Returns": "{ ok: True, items: [ { id, productId, unique_id, qty } ], total: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.696334Z", "status_code": 200, "ok": true, "response_snippet": "{\"count\":1,\"has_more\":false,\"items\":[{\"for_trade\":0,\"game\":\"Unknown Game\",\"id\":316,\"image_url\":null,\"name\":\"1\",\"owned\":1,\"productId\":\"1\",\"rarity\":\"Unknown\",\"set\":\"Unknown Set\",\"unique_id\":\"1\",\"updated_at\":\"2025-10-25T22:27:41.480570\",\"wanted\":0}],\"limit\":50,\"next_offset\":null,\"offset\":0,\"ok\":true,\"total\":1}\n"}, "path_original": "/inventory/list"}, {"path": "/api/mobile/inventory/summary", "function": "mobile_inventory_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Return aggregated summary for user inventory/wishlist/collection.", "Returns": "{ ok: True, total_items, total_value, top_games: [...] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.700256Z", "status_code": 200, "ok": true, "response_snippet": "{\"inventory\":{\"last_updated\":\"2025-10-25T22:27:41.480570\",\"total_for_trade\":0,\"total_inventory\":1,\"total_owned\":1,\"total_wanted\":0,\"unique_cards\":1},\"ok\":true}\n"}, "path_original": "/inventory/summary"}], "legal": [{"path": "/api/mobile/legal/pages", "function": "mobile_legal_pages", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "", "Returns": "feature, ok, pages, placeholder", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.702505Z", "status_code": 200, "ok": true, "response_snippet": "{\"feature\":\"legal_pages\",\"ok\":true,\"pages\":[],\"placeholder\":true}\n"}, "path_original": "/legal/pages"}], "login": [{"path": "/login", "function": "mobile_login_google", "admin": false, "premium": false, "Method": "POST", "Arguments": [], "Description": "Mobile login using username/password credentials.", "Returns": "{ ok: True, access_token, access_expires_in, refresh_token, refresh_expires_in }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.704549Z", "status_code": 302, "ok": true, "response_snippet": "<!doctype html>\n<html lang=en>\n<title>Redirecting...</title>\n<h1>Redirecting...</h1>\n<p>You should be redirected automatically to the target URL: <a href=\"/\">/</a>. If not, click the link.\n"}}], "messages": [{"path": "/api/mobile/messages/list", "function": "mobile_messages_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Send or list direct messages / message threads.", "Returns": "{ ok: True, messages: [...], total: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.710949Z", "status_code": 200, "ok": true, "response_snippet": "{\"has_more\":false,\"items\":[{\"created_at\":\"2025-10-25T23:57:49.989201\",\"id\":18,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":17,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T23:47:26.766280\",\"id\":16,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":15,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:50:49.470539\",\"id\":14,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":13,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:45:47.340494\",\"id\":12,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":11,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:44:03.760136\",\"id\":10,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":9,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:38:59.625877\",\"id\":8,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":7,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:30:37.002957\",\"id\":6,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":5,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:27:41.528349\",\"id\":4,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":3,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:19:45.353193\",\"id\":2,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":1,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"}],\"next_cursor\":null,\"ok\":true}\n"}, "path_original": "/messages/list"}, {"path": "/api/mobile/messages/mark_read", "function": "mobile_messages_mark_read", "admin": false, "premium": false, "Method": "POST", "Arguments": [], "Description": "Send or list direct messages / message threads.", "Returns": "body: { ids: [int] } (POST)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.714700Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"updated\":0}\n"}, "path_original": "/messages/mark_read"}, {"path": "/messages/send", "function": "mobile_messages_send", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Send or list direct messages / message threads.", "Returns": "body: { to, subject?, content } (POST)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.718657Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"username_and_content_required\",\"ok\":false}\n"}, "request_example": {"to": "api_test_partner", "subject": "Test", "content": "Hello from api_test_user"}}, {"path": "/api/mobile/messages/summary", "function": "mobile_messages_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Send or list direct messages / message threads.", "Returns": "None (GET, auth)", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.725692Z", "status_code": 200, "ok": true, "response_snippet": "{\"messages\":{\"threads\":[{\"created_at\":\"2025-10-25T23:57:49.989201\",\"id\":18,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":17,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T23:47:26.766280\",\"id\":16,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":15,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:50:49.470539\",\"id\":14,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":13,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:45:47.340494\",\"id\":12,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":11,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:44:03.760136\",\"id\":10,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":9,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:38:59.625877\",\"id\":8,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":7,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:30:37.002957\",\"id\":6,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":5,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:27:41.528349\",\"id\":4,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":3,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:19:45.353193\",\"id\":2,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":1,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"}],\"unread\":0},\"ok\":true}\n"}, "path_original": "/messages/summary"}, {"path": "/api/mobile/messages/thread/1", "function": "mobile_messages_thread", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user", "root_id: int"], "Description": "Send or list direct messages / message threads.", "Returns": "error, messages, ok, root_id, thread", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.732266Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"thread\":{\"messages\":[{\"content\":\"Hello from partner\",\"created_at\":\"2025-10-25T22:19:45.334440\",\"id\":1,\"is_read\":true,\"receiver\":\"api_test_user\",\"root_id\":1,\"sender\":\"api_test_partner\",\"subject\":\"Test thread\"},{\"content\":\"Thanks, received\",\"created_at\":\"2025-10-25T22:19:45.353193\",\"id\":2,\"is_read\":false,\"receiver\":\"api_test_partner\",\"root_id\":1,\"sender\":\"api_test_user\",\"subject\":null}],\"root_id\":1}}\n"}, "request_example": {"user": "test", "root_msg": "test"}, "path_original": "/messages/thread/<int:root_id>"}, {"path": "/messages/thread/<int:root_id>/reply", "function": "mobile_messages_reply", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user", "root_id: int"], "Description": "Send or list direct messages / message threads.", "Returns": "error, id, message, ok", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.736360Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"content_required\",\"ok\":false}\n"}, "request_example": {"content": "Received, thanks"}}, {"path": "/api/mobile/messages/threads", "function": "mobile_messages_threads", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Send or list direct messages / message threads.", "Returns": "{ ok: True, threads: [...] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.741803Z", "status_code": 200, "ok": true, "response_snippet": "{\"has_more\":false,\"items\":[{\"created_at\":\"2025-10-25T23:57:49.989201\",\"id\":18,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":17,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T23:47:26.766280\",\"id\":16,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":15,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:50:49.470539\",\"id\":14,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":13,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:45:47.340494\",\"id\":12,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":11,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:44:03.760136\",\"id\":10,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":9,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:38:59.625877\",\"id\":8,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":7,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:30:37.002957\",\"id\":6,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":5,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:27:41.528349\",\"id\":4,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":3,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"},{\"created_at\":\"2025-10-25T22:19:45.353193\",\"id\":2,\"is_unread\":false,\"receiver\":\"api_test_partner\",\"root_id\":1,\"sender\":\"api_test_user\",\"snippet\":\"Thanks, received\",\"subject\":\"(no subject)\"}],\"next_cursor\":null,\"ok\":true}\n"}, "path_original": "/messages/threads"}, {"path": "/api/mobile/messages/unread/count", "function": "mobile_messages_unread_count", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Send or list direct messages / message threads.", "Returns": "{ ok: True, unread: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.744827Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"unread\":0}\n"}, "path_original": "/messages/unread/count"}], "mobile": [{"path": "/mobile/inventory/add", "function": "mobile_inventory_add_compat", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Inventory/Wishlist related endpoint: /mobile/inventory/add", "Returns": "{ ok: True, item_id }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.749253Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"missing_data\",\"message\":\"UniqueID is required\",\"ok\":false}\n"}, "request_example": {"unique_id": "1", "quantity": 1, "condition": "Near Mint"}}], "news": [{"path": "/api/mobile/news/list", "function": "mobile_news_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, news: [ { id, title, summary, published_at } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.751567Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"announcements\":[],\"articles\":[],\"message\":\"News feature coming soon\"},\"has_more\":false,\"limit\":20,\"offset\":0,\"ok\":true,\"total\":0}\n"}, "path_original": "/news/list"}], "notifications": [{"path": "/api/mobile/notifications/list", "function": "mobile_notifications_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "List all notifications for the current user.", "Returns": "{ ok: True, notifications: [ { id, type, message, created_at } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.759734Z", "status_code": 200, "ok": true, "response_snippet": "{\"limit\":50,\"notifications\":[{\"content\":\"Become a Premium member\",\"created_at\":\"2025-10-25T23:47:42.099121\",\"id\":18,\"is_read\":false,\"sender_id\":null,\"subject\":\"Achievement Unlocked: VIP Member\"},{\"content\":\"Add your first card to your inventory\",\"created_at\":\"2025-10-25T22:28:33.257185\",\"id\":17,\"is_read\":false,\"sender_id\":null,\"subject\":\"Achievement Unlocked: First Steps\"}],\"offset\":0,\"ok\":true,\"total\":2}\n"}, "path_original": "/notifications/list"}, {"path": "/api/mobile/notifications/mark_read", "function": "mobile_notifications_mark_read", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Mark mobile notifications as read.", "Returns": "{ ok: True }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.763669Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"updated\":0}\n"}, "path_original": "/notifications/mark_read"}, {"path": "/api/mobile/notifications/summary", "function": "mobile_notifications_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get notifications summary for mobile.", "Returns": "{ ok: True, total_unread, recent: [...] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.767467Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"total\":2,\"unread\":2}\n"}, "path_original": "/notifications/summary"}, {"path": "/api/mobile/notifications/unread/count", "function": "mobile_notifications_unread_count", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "Query database and return results.", "Returns": "{ ok: True, unread: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.771133Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"unread\":2}\n"}, "path_original": "/notifications/unread/count"}, {"path": "/api/mobile/notifications/unread_list", "function": "mobile_unread_notifications", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "count, error, message, ok, unread", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.774924Z", "status_code": 200, "ok": true, "response_snippet": "{\"count\":2,\"ok\":true,\"unread\":[{\"content\":\"Become a Premium member\",\"created_at\":\"2025-10-25T23:47:42.099121Z\",\"id\":18,\"subject\":\"Achievement Unlocked: VIP Member\"},{\"content\":\"Add your first card to your inventory\",\"created_at\":\"2025-10-25T22:28:33.257185Z\",\"id\":17,\"subject\":\"Achievement Unlocked: First Steps\"}]}\n"}, "path_original": "/notifications/unread_list"}], "ping": [{"path": "/api/mobile/ping", "function": "mobile_ping", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Mobile login using Google ID token.", "Returns": "{ ok: True, user?: { id, username, is_premium?, is_admin? } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.777202Z", "status_code": 200, "ok": true, "response_snippet": "{\"message\":\"pong\",\"ok\":true,\"user\":{\"id\":7,\"username\":\"api_test_user\"}}\n"}, "path_original": "/ping"}], "referrals": [{"path": "/api/mobile/referrals/info", "function": "mobile_referrals_info", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Lookup a user's referral code by username.", "Returns": "feature, ok, placeholder, referral_code", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.779501Z", "status_code": 200, "ok": true, "response_snippet": "{\"feature\":\"referrals\",\"ok\":true,\"placeholder\":true,\"referral_code\":null}\n"}, "path_original": "/referrals/info"}, {"path": "/api/mobile/referrals/summary", "function": "mobile_referrals_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Lookup a user's referral code by username.", "Returns": "{ ok: True, referrals: { total, converted, rewards } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.781760Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"active_referrals\":0,\"join_bonus_claimed\":false,\"recent_referrals\":[],\"referral_code\":\"USER7\",\"referral_earnings\":0.0,\"total_referrals\":0},\"ok\":true}\n"}, "path_original": "/referrals/summary"}], "refresh": [{"path": "/refresh", "function": "mobile_logout", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Refresh mobile access token using refresh token.", "Returns": "{ ok: True, access_token, access_expires_in, refresh_token, refresh_expires_in }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.786421Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"refresh_token_required\",\"message\":\"Refresh token required.\",\"ok\":false}\n"}, "request_example": {"user": "test", "token": "test", "refresh_token": "test", "user_id": 1}}], "scan": [{"path": "/api/mobile/scan/database-info", "function": "mobile_card_scan_database_info", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, db_version, size_bytes }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:25.788798Z", "status_code": 200, "ok": true, "response_snippet": "{\"database_status\":\"unavailable\",\"last_updated\":null,\"message\":\"Hash database not found. Run hash generation script.\",\"ok\":true,\"total_cards\":0}\n"}, "path_original": "/scan/database-info"}, {"path": "/scan/identify", "function": "mobile_card_scan_identify", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, matches: [ { productId, score } ] }", "Other notes": "Requires authentication.Rate-limited.", "last_test": {"tested_at": "2025-10-26T01:11:26.798458Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"missing_data\",\"message\":\"No data provided\",\"ok\":false}\n"}, "request_example": {"image_data": "", "Game": "Magic"}}], "search": [{"path": "/api/mobile/search/advanced", "function": "mobile_advanced_search", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Search or list card data; supports filters via query params.", "Returns": "{ ok: True, results: [...], total: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.804531Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"filters_applied\":{\"game\":\"\",\"price_range\":[null,null],\"query\":\"\",\"rarity\":\"\",\"set\":\"\"},\"results\":[{\"available_conditions\":[\"poor\",\"played\",\"light played\",\"near mint\"],\"avg_price\":25000.0,\"game\":\"Magic: The Gathering\",\"image_url\":\"/static/images/cards/black-lotus.jpg\",\"in_inventory\":false,\"in_wishlist\":false,\"market_trend\":\"up\",\"name\":\"Black Lotus\",\"rarity\":\"Rare\",\"set\":\"Alpha\",\"unique_id\":\"MTG-001-001\"},{\"available_conditions\":[\"played\",\"light played\",\"near mint\",\"mint\"],\"avg_price\":15.0,\"game\":\"Pokemon\",\"image_url\":\"/static/images/cards/pikachu.jpg\",\"in_inventory\":false,\"in_wishlist\":true,\"market_trend\":\"stable\",\"name\":\"Pikachu\",\"rarity\":\"Common\",\"set\":\"Base Set\",\"unique_id\":\"PKM-001-025\"}],\"total\":2},\"ok\":true}\n"}, "path_original": "/search/advanced"}, {"path": "/api/mobile/search/cards", "function": "mobile_search_cards", "admin": true, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Search cards from mobile application.", "Returns": "{ ok: True, results: [ { productId, name, image_url, price } ], total: <int> }", "Other notes": "Requires authentication.Rate-limited.", "last_test": {"tested_at": "2025-10-26T01:11:26.807078Z", "status_code": 200, "ok": true, "response_snippet": "{\"empty_store\":true,\"ok\":true,\"results\":[],\"total\":0}\n"}, "path_original": "/search/cards"}, {"path": "/api/mobile/search/history", "function": "mobile_search_history", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get search history for mobile user.", "Returns": "{ ok: True, history: [ { query, ts } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.809350Z", "status_code": 200, "ok": true, "response_snippet": "{\"history\":[],\"ok\":true}\n"}, "path_original": "/search/history"}, {"path": "/api/mobile/search/meta", "function": "mobile_search_meta", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get search metadata for mobile app.", "Returns": "{ ok: True, meta: { games: [...], sets: [...], rarities: [...] } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.811694Z", "status_code": 200, "ok": true, "response_snippet": "{\"games\":[],\"ok\":true,\"progressive\":false,\"rarities\":[],\"sets\":[]}\n"}, "path_original": "/search/meta"}, {"path": "/api/mobile/search/popular", "function": "mobile_popular_searches", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Search or list card data; supports filters via query params.", "Returns": "{ ok: True, queries: [ { q, count } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.813967Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":[{\"count\":1250,\"query\":\"Magic: The Gathering\"},{\"count\":980,\"query\":\"Pokemon\"},{\"count\":750,\"query\":\"Yu-Gi-Oh!\"},{\"count\":500,\"query\":\"Charizard\"}],\"ok\":true}\n"}, "path_original": "/search/popular"}, {"path": "/api/mobile/search/saved", "function": "mobile_saved_searches_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "List saved searches for mobile user.", "Returns": "{ ok: True, saved_searches: [ { id, name, query } ] }", "Other notes": "Requires authentication.Rate-limited.", "last_test": {"tested_at": "2025-10-26T01:11:26.821441Z", "status_code": 200, "ok": true, "response_snippet": "{\"has_more\":false,\"limit\":50,\"next_offset\":null,\"offset\":0,\"ok\":true,\"saved_searches\":[],\"total\":0}\n"}, "path_original": "/search/saved"}, {"path": "/search/saved", "function": "mobile_saved_searches_create", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "List saved searches for mobile user.", "Returns": "{ ok: True, saved_searches: [ { id, name, query } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.825658Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"name_required\",\"ok\":false}\n"}, "request_example": {"name": "api_test_search_more", "filters": {}}}, {"path": "/api/mobile/search/saved/1", "function": "mobile_saved_searches_delete", "admin": false, "premium": false, "Method": "DELETE", "Arguments": ["saved_id"], "Description": "Search or list card data; supports filters via query params.", "Returns": "deleted, error, ok", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.831136Z", "status_code": 404, "ok": false, "response_snippet": "<!doctype html>\n<html lang=en>\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>\n"}, "request_example": {"user": "test", "ss": "test"}, "path_original": "/search/saved/<int:saved_id>"}, {"path": "/api/mobile/search/status", "function": "mobile_search_status", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Search or list card data; supports filters via query params.", "Returns": "{ ok: True, status: { queued, last_run, errors? } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.833393Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"card_store_loaded\":false,\"message\":\"Search disabled - card data not loaded (SKIP_CARD_LOAD=1)\",\"search_available\":false,\"skip_card_load_enabled\":true,\"total_cards\":0},\"ok\":true}\n"}, "path_original": "/search/status"}], "set_completion": [{"path": "/api/mobile/set_completion/summary", "function": "mobile_set_completion_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "", "Returns": "feature, ok, placeholder, sets", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.835562Z", "status_code": 200, "ok": true, "response_snippet": "{\"feature\":\"set_completion_summary\",\"ok\":true,\"placeholder\":true,\"sets\":[]}\n"}, "path_original": "/set_completion/summary"}], "sets": [{"path": "/api/mobile/sets/completion", "function": "mobile_sets_completion_enhanced", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, set_code, completion_percent, total_owned }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.838383Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"sets\":[{\"game\":\"Magic: The Gathering\",\"id\":1,\"image_url\":\"/static/images/sets/magic_foundations.jpg\",\"name\":\"Magic Foundations\",\"owned\":45,\"total\":50,\"year\":\"2025\"},{\"game\":\"Pokemon\",\"id\":2,\"image_url\":\"/static/images/sets/pokemon_base.jpg\",\"name\":\"Pokemon Base Set\",\"owned\":102,\"total\":102,\"year\":\"1998\"},{\"game\":\"Yu-Gi-Oh!\",\"id\":3,\"image_url\":\"/static/images/sets/yugioh_lob.jpg\",\"name\":\"Yu-Gi-Oh! LOB\",\"owned\":32,\"total\":78,\"year\":\"2002\"}]},\"ok\":true}\n"}, "path_original": "/sets/completion"}], "settings": [{"path": "/settings", "function": "mobile_settings", "admin": false, "premium": true, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, settings: { notifications, privacy, trade_defaults } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.878373Z", "status_code": 200, "ok": true, "response_snippet": "﻿<!DOCTYPE html>\n<html lang=\"en\" data-bs-theme=\"dark\" >\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-cache, no-store, must-revalidate\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n    <title>Settings - TCG Traders</title>\n    \n    <!-- Bootstrap CSS -->\n    <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <!-- Font Awesome -->\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">\n    <!-- Custom CSS with cache busting -->\n    <link rel=\"stylesheet\" href=\"/static/css/style.css?v=20250901c\">\n    <link rel=\"stylesheet\" href=\"/static/css/tcg-dark-theme.css?v=20250817b\">\n    <style>\n    /* PRO badge: single smooth yellow→pink gradient, gem icon */\n    .badge-pro {\n        display: inline-flex;\n        align-items: center;\n        gap: 0.35rem;\n        background: linear-gradient(90deg, #ff69b4 0%, #ffd700 100%);\n        color: #000000;\n        font-weight: 700;\n        font-size: 0.75rem;\n        padding: 0.25rem 0.6rem;\n        border-radius: 0.375rem;\n        letter-spacing: 0.02em;\n        line-height: 1;\n        background-clip: padding-box;\n        border: none;\n        vertical-align: middle;\n    }\n\n    .badge-pro .fa-gem {\n        font-size: 0.85em;\n        line-height: 1;\n        color: #000000;\n    }\n\n    /* Lifetime badge: solid yellow, white text, gem on each side */\n    .badge-lifetime {\n        display: inline-flex;\n        align-items: center;\n        gap: 0.35rem;\n        background: #ffd700;\n        color: #fff;\n        font-weight: 700;\n        font-size: 0.75rem;\n        padding: 0.25rem 0.6rem;\n        border-radius: 0.375rem;\n        letter-spacing: 0.02em;\n        line-height: 1;\n        box-shadow: 0 4px 18px rgba(0,0,0,0..."}}, {"path": "/settings", "function": "mobile_settings_update", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, settings: { notifications, privacy, trade_defaults } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.889728Z", "status_code": 200, "ok": true, "response_snippet": "﻿<!DOCTYPE html>\n<html lang=\"en\" data-bs-theme=\"dark\" >\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta http-equiv=\"Cache-Control\" content=\"no-cache, no-store, must-revalidate\">\n    <meta http-equiv=\"Pragma\" content=\"no-cache\">\n    <meta http-equiv=\"Expires\" content=\"0\">\n    <title>Settings - TCG Traders</title>\n    \n    <!-- Bootstrap CSS -->\n    <link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n    <!-- Font Awesome -->\n    <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css\">\n    <!-- Custom CSS with cache busting -->\n    <link rel=\"stylesheet\" href=\"/static/css/style.css?v=20250901c\">\n    <link rel=\"stylesheet\" href=\"/static/css/tcg-dark-theme.css?v=20250817b\">\n    <style>\n    /* PRO badge: single smooth yellow→pink gradient, gem icon */\n    .badge-pro {\n        display: inline-flex;\n        align-items: center;\n        gap: 0.35rem;\n        background: linear-gradient(90deg, #ff69b4 0%, #ffd700 100%);\n        color: #000000;\n        font-weight: 700;\n        font-size: 0.75rem;\n        padding: 0.25rem 0.6rem;\n        border-radius: 0.375rem;\n        letter-spacing: 0.02em;\n        line-height: 1;\n        background-clip: padding-box;\n        border: none;\n        vertical-align: middle;\n    }\n\n    .badge-pro .fa-gem {\n        font-size: 0.85em;\n        line-height: 1;\n        color: #000000;\n    }\n\n    /* Lifetime badge: solid yellow, white text, gem on each side */\n    .badge-lifetime {\n        display: inline-flex;\n        align-items: center;\n        gap: 0.35rem;\n        background: #ffd700;\n        color: #fff;\n        font-weight: 700;\n        font-size: 0.75rem;\n        padding: 0.25rem 0.6rem;\n        border-radius: 0.375rem;\n        letter-spacing: 0.02em;\n        line-height: 1;\n        box-shadow: 0 4px 18px rgba(0,0,0,0..."}}], "shop": [{"path": "/shop/items", "function": "_mobile_shop_items_placeholder_removed_for_duplicate_fix", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, items: [ { id, name, price_cents } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.894054Z", "status_code": 501, "ok": false, "response_snippet": "{\"error\":\"not_implemented\",\"message\":\"This endpoint was removed in favor of a single implementation\",\"ok\":false}\n"}}, {"path": "/shop/items", "function": "mobile_shop_items", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, items: [ { id, name, price_cents } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.897966Z", "status_code": 501, "ok": false, "response_snippet": "{\"error\":\"not_implemented\",\"message\":\"This endpoint was removed in favor of a single implementation\",\"ok\":false}\n"}}, {"path": "/shop/payment/confirm", "function": "mobile_confirm_payment", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, payment: { id, status } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.902070Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"missing_data\",\"message\":\"Payment intent ID is required\",\"ok\":false}\n"}, "request_example": {"payment_intent_id": 1}}, {"path": "/shop/payment/create-intent", "function": "mobile_create_payment_intent", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "", "Returns": "{ ok: True, client_secret, intent_id }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.906141Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"missing_data\",\"message\":\"Product ID is required\",\"ok\":false}\n"}, "request_example": {"payment_method": "test", "quantity": "test", "product_id": 1, "product": "test"}}], "statistics": [{"path": "/api/mobile/statistics/summary", "function": "mobile_statistics_summary", "admin": false, "premium": true, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, stats: { users, trades, inventory_items } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.909768Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"global_stats\":{\"active_trades\":0,\"total_cards\":0,\"total_users\":6},\"recent_activity\":{\"messages_today\":0,\"new_users_today\":0,\"trades_today\":0},\"user_stats\":{\"inventory_items\":1,\"is_premium\":true,\"member_since\":\"2025-10-25T21:56:50.308818\",\"rank_points\":0}},\"ok\":true}\n"}, "path_original": "/statistics/summary"}], "stats": [{"path": "/api/mobile/stats/summary", "function": "mobile_stats_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "", "Returns": "feature, ok, placeholder, totals", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:26.912536Z", "status_code": 200, "ok": true, "response_snippet": "{\"feature\":\"stats_summary\",\"ok\":true,\"placeholder\":true,\"totals\":{}}\n"}, "path_original": "/stats/summary"}], "test": [{"path": "/api/mobile/test/image", "function": "mobile_debug_connection", "admin": false, "premium": false, "Method": "GET", "Arguments": [], "Description": "", "Returns": "error, status", "Other notes": "", "last_test": {"tested_at": "2025-10-26T01:11:27.049439Z", "status_code": 200, "ok": true, "response_snippet": "{\"found\":true,\"image_url\":\"https://10.0.0.154/static/LQ2/1000.jpg\",\"product_id\":\"1000\",\"test_instructions\":[\"Copy the image_url\",\"Paste it in your browser to verify it works\",\"Then try loading it in your Flutter app using Image.network()\",\"Add errorBuilder to see any specific errors\"]}\n"}, "path_original": "/test/image"}], "trades": [{"path": "/api/mobile/trades/1", "function": "mobile_trade_detail", "admin": false, "premium": false, "Method": "GET", "Arguments": ["trade_id: int"], "Description": "Manage or list trades.", "Returns": "error, ok, trade", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.087506Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"trade\":{\"coins_offered\":0,\"coins_requested\":0,\"comment\":\"API test fixture trade\",\"created_at\":\"2025-10-25T22:19:45.305486\",\"escrow\":{\"agreed_receiver\":false,\"agreed_sender\":true,\"initiator_id\":7,\"status\":\"pending_submission\",\"tracking_inbound\":null,\"tracking_outbound\":null},\"id\":1,\"offered_cards\":[{\"coin_value\":0,\"condition\":\"Near Mint\",\"quantity\":1,\"unique_id\":\"1\"}],\"points_offered\":0,\"points_requested\":0,\"receiver_received\":false,\"receiver_shipped\":false,\"requested_cards\":[],\"role\":\"sender\",\"sender_received\":false,\"sender_shipped\":false,\"status\":\"pending\",\"trade_type\":\"cards_only\",\"updated_at\":\"2025-10-25T23:49:36.996679\",\"use_escrow\":true}}\n"}, "request_example": {"user": "test", "trade": "test"}, "path_original": "/trades/<int:trade_id>"}, {"path": "/trades/<int:trade_id>/action", "function": "mobile_trade_action", "admin": false, "premium": false, "Method": "POST", "Arguments": ["trade_id: int"], "Description": "Accept/reject/cancel or perform actions on trades.", "Returns": "changed, error, ok, status", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.092760Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"unknown_action\",\"ok\":false}\n"}, "request_example": {"action": "cancel"}}, {"path": "/api/mobile/trades/1/escrow/agree", "function": "mobile_trade_escrow_agree", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user", "trade_id: int"], "Description": "Manage or list trades.", "Returns": "agreed_receiver, agreed_sender, trade_id", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.108152Z", "status_code": 200, "ok": true, "response_snippet": "{\"agreed_receiver\":false,\"agreed_sender\":true,\"ok\":true,\"trade_id\":1}\n"}, "request_example": {"trade": "test"}, "path_original": "/trades/<int:trade_id>/escrow/agree"}, {"path": "/api/mobile/trades/1/escrow/enable", "function": "mobile_trade_escrow_enable", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user", "trade_id: int"], "Description": "Manage or list trades.", "Returns": "already_enabled, trade_id", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.115481Z", "status_code": 200, "ok": true, "response_snippet": "{\"already_enabled\":true,\"ok\":true,\"trade_id\":1}\n"}, "request_example": {"trade": "test"}, "path_original": "/trades/<int:trade_id>/escrow/enable"}, {"path": "/trades/<int:trade_id>/escrow/tracking", "function": "mobile_trade_escrow_tracking", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user", "trade_id: int"], "Description": "Manage or list trades.", "Returns": "status, tracking_inbound, trade_id", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.125377Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"tracking_required\",\"message\":\"Tracking number required\",\"ok\":false}\n"}, "request_example": {"trade": "test", "tracking_number": 1, "tracking": "test"}}, {"path": "/trades/create", "function": "mobile_trade_create", "admin": false, "premium": false, "Method": "POST", "Arguments": [], "Description": "Manage or list trades.", "Returns": "error, message, ok, trade_id", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.134347Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"partner_required\",\"ok\":false}\n"}, "request_example": {"partner_username": "api_test_partner", "offered": [{"unique_id": "1", "quantity": 1}], "requested": [], "message": "Test trade"}}, {"path": "/api/mobile/trades/list", "function": "mobile_trades_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Manage or list trades.", "Returns": "{ ok: True, trades: [ { id, other_user, status } ], total: <int> }", "Other notes": "Requires authentication.Rate-limited.", "last_test": {"tested_at": "2025-10-26T01:11:27.158209Z", "status_code": 200, "ok": true, "response_snippet": "{\"has_more\":false,\"limit\":50,\"next_offset\":null,\"offset\":0,\"ok\":true,\"status_filter\":null,\"total\":1,\"trades\":[{\"coins_offered\":0,\"coins_requested\":0,\"created_at\":\"2025-10-25T22:19:45.305486\",\"id\":1,\"points_offered\":0,\"points_requested\":0,\"role\":\"sender\",\"status\":\"pending\",\"trade_type\":\"cards_only\",\"updated_at\":\"2025-10-25T23:49:36.996679\"}]}\n"}, "path_original": "/trades/list"}, {"path": "/api/mobile/trades/match_preview", "function": "mobile_trade_match_preview", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Preview trade matches for mobile.", "Returns": "error, offered_candidates, ok, partner_found, requested_candidates", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.160816Z", "status_code": 200, "ok": true, "response_snippet": "{\"offered_candidates\":[],\"ok\":true,\"partner_found\":false,\"requested_candidates\":[]}\n"}, "path_original": "/trades/match_preview"}, {"path": "/api/mobile/trades/partners", "function": "mobile_trade_partners", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get trade partners for mobile user.", "Returns": "error, ok, partners", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.169572Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"partners\":[{\"source\":\"friend\",\"username\":\"api_test_partner\"}]}\n"}, "path_original": "/trades/partners"}, {"path": "/trades/respond", "function": "mobile_trade_respond", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Accept/reject/cancel or perform actions on trades.", "Returns": "{ ok: True, result } or error", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.173707Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"invalid_payload\",\"ok\":false}\n"}, "request_example": {"trade_id": 1, "action": "cancel"}}, {"path": "/api/mobile/trades/summary", "function": "mobile_trades_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Return summary counts for user trades.", "Returns": "{ ok: True, trades: [...], total: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.189868Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"trades\":{\"accepted\":0,\"cancelled\":0,\"completed\":0,\"incoming_offers\":0,\"last_trade\":{\"coins_offered\":0,\"coins_requested\":0,\"created_at\":\"2025-10-25T22:19:45.305486\",\"id\":1,\"is_receiver\":false,\"is_sender\":true,\"points_offered\":0,\"points_requested\":0,\"status\":\"pending\",\"trade_type\":\"cards_only\",\"updated_at\":\"2025-10-25T23:49:36.996679\"},\"outgoing_offers\":1,\"pending\":1}}\n"}, "path_original": "/trades/summary"}, {"path": "/api/mobile/trades/value", "function": "mobile_trade_value", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Calculate trade value for mobile.", "Returns": "diff, error, lines, offered_total, ok, requested_total", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.192537Z", "status_code": 200, "ok": true, "response_snippet": "{\"diff\":0,\"lines\":{},\"offered_total\":0,\"ok\":true,\"requested_total\":0}\n"}, "path_original": "/trades/value"}], "user": [{"path": "/api/mobile/user/profile", "function": "mobile_user_profile", "admin": false, "premium": true, "Method": "GET", "Arguments": [], "Description": "Search for users by username or email.", "Returns": "{ ok: True, profile: { id, username, avatar_url, bio } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.194804Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"profile\":{\"avatar_url\":null,\"coins\":0,\"email\":\"\",\"email_verified\":false,\"escrow_tokens\":5,\"id\":7,\"premium_expires_at\":null,\"username\":\"api_test_user\"}}\n"}, "path_original": "/user/profile"}, {"path": "/api/mobile/user/progress", "function": "mobile_user_progress", "admin": false, "premium": true, "Method": "GET", "Arguments": ["current_user"], "Description": "Get user progress information for mobile.", "Returns": "achievement_points, error, level, level_progress, ok, premium, progress, rank, rank_points, reputation, streak_days", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.197081Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true,\"progress\":{\"achievement_points\":115,\"level\":1,\"level_progress\":{\"current\":0,\"max_level\":false,\"needed\":100,\"next\":100,\"progress\":0},\"premium\":true,\"rank\":\"Novice\",\"rank_points\":0,\"reputation\":0,\"streak_days\":0}}\n"}, "path_original": "/user/progress"}, {"path": "/api/mobile/user/state", "function": "mobile_user_state", "admin": false, "premium": true, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, state: { inventory_count, unread_messages, pending_trades } }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.203133Z", "status_code": 200, "ok": true, "response_snippet": "{\"dms_unread\":0,\"friend_requests\":{\"incoming_pending\":0,\"outgoing_pending\":1},\"friends\":1,\"notifications_unread\":2,\"ok\":true,\"premium\":true,\"rank_points\":0,\"user\":{\"id\":7,\"username\":\"api_test_user\"}}\n"}, "path_original": "/user/state"}], "users": [{"path": "/api/mobile/users/list", "function": "mobile_users_list", "admin": false, "premium": true, "Method": "GET", "Arguments": ["current_user"], "Description": "Query database and return results.", "Returns": "{ ok: True, users: [ { id, username, avatar } ], total: <int> }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.215520Z", "status_code": 200, "ok": true, "response_snippet": "{\"data\":{\"users\":[{\"id\":2,\"is_premium\":true,\"member_since\":\"2025-09-05T10:11:20.868992\",\"rank_points\":3086,\"username\":\"Kairi\"},{\"id\":5,\"is_premium\":false,\"member_since\":\"2025-09-09T02:32:06.856388\",\"rank_points\":10,\"username\":\"cavelepus\"},{\"id\":6,\"is_premium\":false,\"member_since\":\"2025-10-14T14:51:39.390047\",\"rank_points\":0,\"username\":\"GoogleUserCreationTest\"},{\"id\":8,\"is_premium\":false,\"member_since\":\"2025-10-25T22:19:45.263508\",\"rank_points\":0,\"username\":\"api_test_partner\"},{\"id\":3,\"is_premium\":false,\"member_since\":\"2025-09-05T14:54:56.126355\",\"rank_points\":0,\"username\":\"tester\"}]},\"has_more\":false,\"limit\":50,\"offset\":0,\"ok\":true,\"total\":5}\n"}, "path_original": "/users/list"}], "wishlist": [{"path": "/api/mobile/wishlist/list", "function": "mobile_wishlist_list_alias", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Return paginated list of items for the user.", "Returns": "{ ok: True, items: [ { productId, note?, added_at? } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.221268Z", "status_code": 200, "ok": true, "response_snippet": "{\"items\":[],\"ok\":true,\"summary\":{\"by_game\":{},\"ok\":true,\"public\":false,\"share_url\":null,\"total\":0}}\n"}, "path_original": "/wishlist/list"}, {"path": "/wishlist/remove", "function": "mobile_wishlist_remove_v2", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Return paginated list of items for the user.", "Returns": "{ ok: True } or error", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.225518Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"missing_data\",\"message\":\"UniqueID is required\",\"ok\":false}\n"}, "request_example": {"unique_id": "1"}}], "wishlists": [{"path": "/api/mobile/wishlists/items", "function": "mobile_wishlist_list", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get wishlist items for mobile user.", "Returns": "{ ok: True, items: [ { productId, note?, added_at? } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.230803Z", "status_code": 200, "ok": true, "response_snippet": "{\"has_more\":false,\"items\":[],\"limit\":50,\"next_offset\":null,\"offset\":0,\"ok\":true,\"total\":0}\n"}, "path_original": "/wishlists/items"}, {"path": "/wishlists/items", "function": "mobile_wishlist_add", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Get wishlist items for mobile user.", "Returns": "{ ok: True, items: [ { productId, note?, added_at? } ] }", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.235007Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"product_id_required\",\"message\":\"productId required\",\"ok\":false}\n"}, "request_example": {"productId": "1", "max_price": 1.0, "condition": "Near Mint"}}, {"path": "/api/mobile/wishlists/items/1", "function": "mobile_wishlist_remove_by_id", "admin": false, "premium": false, "Method": "DELETE", "Arguments": ["item_id"], "Description": "Get specific wishlist item details.", "Returns": "deleted, error, ok", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.244783Z", "status_code": 404, "ok": false, "response_snippet": "<!doctype html>\n<html lang=en>\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>\n"}, "request_example": {"user": "test", "item": "test"}, "path_original": "/wishlists/items/<int:item_id>"}, {"path": "/wishlists/items/remove", "function": "mobile_wishlist_remove", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Remove items from mobile wishlist.", "Returns": "deleted, productId", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.248885Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"product_id_required\",\"message\":\"productId required\",\"ok\":false}\n"}, "request_example": {"productId": "1"}}, {"path": "/wishlists/items/toggle_public", "function": "mobile_wishlist_toggle_public", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Toggle wishlist public visibility.", "Returns": "created, error, id, ok, productId, public, updated", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.253030Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"product_id_required\",\"message\":\"productId required\",\"ok\":false}\n"}, "request_example": {"productId": "1", "public": true}}, {"path": "/wishlists/public/<username>", "function": "mobile_wishlist_public_view", "admin": false, "premium": false, "Method": "GET", "Arguments": ["username"], "Description": "View public wishlist of another user.", "Returns": "error, id, items, ok, owner, total_public, username", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.261411Z", "status_code": 404, "ok": false, "response_snippet": "<!doctype html>\n<html lang=en>\n<title>404 Not Found</title>\n<h1>Not Found</h1>\n<p>The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.</p>\n"}, "request_example": {"u": "test", "username": "test", "viewer": "test"}}, {"path": "/wishlists/public/toggle", "function": "mobile_wishlist_toggle_public_legacy", "admin": false, "premium": false, "Method": "POST", "Arguments": ["current_user"], "Description": "Toggle public wishlist visibility.", "Returns": "error, ok, productId, public", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.265523Z", "status_code": 400, "ok": false, "response_snippet": "{\"error\":\"product_id_required\",\"ok\":false}\n"}, "request_example": {"productId": "1", "public": true}}, {"path": "/api/mobile/wishlists/summary", "function": "mobile_wishlist_summary", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Get wishlist summary for mobile user.", "Returns": "by_game, error, game, game_count, ok, public, share_url, total", "Other notes": "Requires authentication.", "last_test": {"tested_at": "2025-10-26T01:11:27.268287Z", "status_code": 200, "ok": true, "response_snippet": "{\"by_game\":{},\"ok\":true,\"public\":false,\"share_url\":null,\"total\":0}\n"}, "path_original": "/wishlists/summary"}, {"path": "/api/public_wishlists", "function": "api_public_wishlists", "admin": false, "premium": false, "Method": "GET", "Arguments": ["current_user"], "Description": "Return a compact JSON summary of public wishlists for the Browse tab. By default returns site-wide public wishlists; callers may pass ?friends_only=1 to restrict to friends only.", "Returns": "{ public_wishlists: [ { id, name, description, owner_username, owner_id, cards: [ { name, product_id, unique_id, image_url } ] } ] }", "Other notes": "Requires authentication. Capped to scanning a limited set of users (200) and up to 6 preview cards per wishlist to keep payload small.", "last_test": {"tested_at": null, "status_code": null, "ok": null, "response_snippet": null}}], "debug": [{"path": "/_local_debug_ping", "function": "_local_debug_ping", "admin": false, "premium": false, "Method": "GET, POST", "Arguments": [], "Description": "Local debug endpoint used by wishlist debug toolbar. Returns a simple JSON payload and logs the remote address.", "Returns": "{ ok: True }", "Other notes": "DEV only. Not intended for public use — keep restricted to local/dev environments and remove before production deployment.", "last_test": {"tested_at": "2025-10-26T01:11:23.119719Z", "status_code": 200, "ok": true, "response_snippet": "{\"ok\":true}\n"}}]}