All notable changes to AI Price Radar are documented in this file.
- Added
POST /api/v1/admin/source-candidates/cleanupendpoint to purge invalid candidates (no_match,validation_failed,disabled,rejected) while strictly protecting promoted candidates and source intakes. - Added "清理无效候选" (Batch Cleanup Invalid Candidates) button with confirmation prompt and execution feedback in the admin Source Discovery panel.
- Added Business Cooperation & Advertising page (
/advertise) and official contact email (info@ai.pricememo.cn). - Added backend
SystemSettingkey-value model and admin API endpoints (GET /api/v1/admin/settings,PATCH /api/v1/admin/settings). - Added admin panel toggle switch for
advertise_enabledto dynamically control public visibility of commercial cooperation links and gate/advertise.
- Kept Dujiao-Next discovery disabled in complete remote refreshes unless explicitly enabled.
- Made the production Importer image use the configured Python package mirror so dependency installation is reproducible during deployment.
- Preserve failed crawler discovery batches for a retry instead of silently dropping candidates.
- Hardened admin and worker authentication, email delivery, source-intake state transitions, and notification retries.
- Prevented hidden, stale, unpublished, disabled-platform, non-finite-price, and cross-product data from leaking into public catalog and history responses.
- Tightened classifier, discovery, JSON-LD/XML parsing, crawler budgets, and pipeline input validation without re-enabling disabled Dujiao-Next publication.
- Fixed Web API error handling, watchlist bounds, public-source URL checks, mobile navigation, and visible focus states.
- Guarded PostgreSQL restore database names against identifier truncation.
- Accurate Product Classification for Free Accounts and Tools:
- Cleanly stripped exclusion phrases (
除Codex,不可codex,除Plus, etc.) in brand and tier detection, ensuring titles like(可网页反代,除Codex)are not misidentified as Codex/Plus. - Expanded
CHATGPT_FREE_MARKERSto recognizeg free,g-free,gfree,codex free,outlook/icloud/gmail free,free账密,free成品,free底号,可升级plus,开plus专用,好底号,未绑卡, and correctly route them tochatgpt-accountinstead ofchatgpt-plus. - Prevented session relay indicators (
反代专用) from overriding free account markers. - Added payment link tools and verification CDK markers (
提炼,代提链,直卡支付链接,支付链接,卡头开通plus必备,提炼cdk,实卡号码,无限接马) to classify intochatgpt-access-service. - Enforced a price safeguard for
chatgpt-plus(< 8.00 CNY): demotes free helper accounts tochatgpt-account, helper tools/links tochatgpt-access-service, and flags abnormal low prices. - Synchronized classifier rules between
apps/api/app/services/classifier.pyandpipeline/common.py.
- Cleanly stripped exclusion phrases (
- Admin Offer Sorting Aligned with Frontend:
GET /api/v1/admin/offersdefaults tosort="frontend", matching the public site ranking (in_stock desc,cny_first,price asc,observed_at desc).- Added sort selector in the admin search & filter bar with options for frontend default, latest updated (
updated_desc), price low-to-high (price_asc), and price high-to-low (price_desc).
- Admin Real-time Brand and Product Offer Counts:
GET /api/v1/admin/statsnow calculates and returnsproduct_counts(by product slug) andbrand_counts(by brand platform) across all active, public offers.- Added real-time count badges to each Brand Chip and Product Chip in the admin navigation rails.
- Returns
X-Total-Countheader inGET /api/v1/admin/offersto report exact matching offer count. - Displayed
共 {offerTotal} 条报价(已载入前 {offers.length} 条)summary header and added bottom pagination ("加载更多报价") so large product sets can be fully explored.
- Catalog Alignment:
- Added
chatgpt-pro(ChatGPT Pro) toPRODUCT_TABS.OpenAIinapps/web/lib/catalog.ts.
- Added
- Prevent Scroll-to-Top on Admin Approval and Status Actions:
- Implemented optimistic in-place state updates for offer actions (
patchOffer,reclassifySingleOffer) to prevent DOM node unmounting and focus loss. - Added
preserveScrollhelper to lock and restore window scroll coordinates (window.scrollY) across all administrative updates (offers, shop intakes, user reports). - Explicitly marked all action buttons with
type="button"and blurred active elements prior to asynchronous state updates.
- Implemented optimistic in-place state updates for offer actions (
- Admin Category Hierarchy Aligned with Frontend:
- Replaced the admin offers panel's flat product slug list with a brand and product rail matching the public catalog (
apps/web/lib/catalog.ts). - Added dedicated navigation views for
🚫 受限/已隐藏and❓ 未分类商品with real-time offer count badges. - Added
brandparameter filtering inGET /api/v1/admin/offersand enriched offer responses withbrandandproduct_name. - Added grouped
<optgroup>selection by brand hierarchy for offer reclassification. - Clearly highlighted restriction reasons for restricted/hidden offers with one-click restore (
恢复公开) and hide (隐藏/限制) actions.
- Replaced the admin offers panel's flat product slug list with a brand and product rail matching the public catalog (
- Paused Dujiao-Next Candidate Discovery & Web Submission:
- Paused automatic Dujiao-Next discovery in remote refresh scripts (
ENABLE_DUJIAO_DISCOVERY=false) and removeddujiao-nextsearch queries from GitHub discovery. - Disabled the Dujiao-Next option on the public shop submission form (
/shops/submit) with(暂停收录)badge. - Filtered out
dujiao_nextfrom the frontend catalog source platform filters. - Documented discovery pause and frontend disabled status in
docs/CONNECTORS.md.
- Paused automatic Dujiao-Next discovery in remote refresh scripts (
- Include Shop Address and Name in Intake Notification Emails:
- Added merchant's original shop URL (
店铺地址:{source_url}) and shop name (店铺名称:{shop_name}) to all applicant notification emails:- Auto-approval notifications (
shop_request.approved) - Manual approval notifications (
shop_request.approved) - Shop onboarding & publish notifications (
shop_intake.onboarded), clearly distinguishing the merchant's店铺地址and本站收录页面 - Rejection notifications (
shop_request.rejected) - Scan completion with no products (
shop_intake.no_products) and validation failures (shop_intake.validation_failed)
- Auto-approval notifications (
- Ensures merchants can immediately identify which shop request has been processed and follow the links directly.
- Added merchant's original shop URL (
- Phone Verification Services Included in Benchmark Comparable Pricing:
- Added
verification_service(手机接码,实卡接码,短信验证) toCOMPARABLE_DELIVERY_TYPES(is_comparable=True). - Fixes issue where the dedicated
ChatGPT 手机接码(chatgpt-access-service) product page displayed 0 offers and "暂无有货价" by default becauseofferQueryfilters forcomparable=true.
- Added
- Reverse-Proxy Tokens Included in Benchmark Pricing:
- Included
session_tokendelivery type (只能反代,仅反代,无账号密码,发CDK不可网页) intoCOMPARABLE_DELIVERY_TYPES. - Reverse-proxy token accounts now participate in comparable pricing calculations (
is_comparable=True) as a recognized account delivery mode.
- Included
- Plus Account & SMS Service Precision Classification:
- Eliminated false routing into
chatgpt-access-servicecaused by substring matching of接马inside account status markers (未接马,需自行接马,自行接马,免接马). - Removed legacy
GENERIC_EMAIL_MARKERS(Gmail, iCloud) fallback fromchatgpt-access-service, ensuring accounts with iCloud/Gmail emails (e.g.韩国-PLUS-icloud邮箱,GP Plus gmail越南渠道) correctly classify aschatgpt-plus. - Added support for
team/周限额in implicit brand detection so长效周限额teamroutes accurately tochatgpt-k12. - Enhanced delivery type detection:
未接码/未接马recognized assemi_finished_account(半成品/首登号),icloudand保首登recognized asfinished_account(成品号).
- Eliminated false routing into
- Codex Classification Merged into ChatGPT Plus & Respective Tiers:
- Eliminated the top-level
brand == "codex"prefix hijacking that forced all Codex-tagged items intocodex-access. - Reclassified Codex accounts into their true underlying tiers:
chatgpt-plus(for Plus/Sub2API/RT/CPA),chatgpt-go(for Codex Go),chatgpt-k12(for Team), andchatgpt-account(for Free). - Preserved
Codex,Sub2API,带RTas scenario tags.
- Eliminated the top-level
- Dedicated SMS Verification ("手机接码") Category:
- Differentiated account attribute markers (
已接码,已接马,已绑手机) from independent verification services (代接码,手机接码,实卡接码,接码卡密). - Allowed SMS verification services through classifier and renamed public frontend tab
辅助服务to手机接码. - Removed
Codexstandalone tab from OpenAI navigation header.
- Differentiated account attribute markers (
- CRLF & Email Header Injection Protection:
- Sanitized
subject,recipient, anddedupe_keyacross the outbox notification pipeline (apps/api/app/services/source_intake.pyandapps/api/app/services/outbox.py). - Added strict email format validation in
ShopRequestCreateforbidding CRLF, control characters, commas, and quotes. - Added strict sanitization to
shop_nameandnotestripping all control characters and angle brackets to prevent header and template injection.
- Sanitized
- SSRF Hardening:
- Strengthened
normalize_public_https_urlinapps/api/app/services/source_platform.pyto forbid internal hostnames, loopback/private/link-local/multicast IPs, and internal TLD suffixes (.local,.internal,.lan,.home,.corp,.intranet,.priv,.arpa). - Verified parameterized SQL queries across all repositories.
- Strengthened
- Automatic Shop Intake Approval: Enabled automated shop intake approval via
SHOP_INTAKE_AUTO_APPROVE(Truein production). When a store request completes automated security and platform detection (ldxp,dujiao_next,woocommerce,16688,merchant_json,schema_org), it is automatically approved into the worker validation/publishing queue without requiring manual admin intervention. - Admin Auto-Approval Email Notifications: Automatically dispatches a notification email (
shop_request.auto_approved.admin) to configured administrator emails (SHOP_INTAKE_ADMIN_EMAILS) whenever a shop request is automatically approved, providing full store details, detected platform, and direct links to the admin console.
- Applicant Notification: Added explicit notifications to applicants confirming automatic approval upon successful probe detection.
- Follow
docs/QUICK_DEPLOY.mdand deploy only tagv3.7.32after CI passes. - Rebuild and restart
api. - Set
SHOP_INTAKE_AUTO_APPROVE=truein.envon production.
- Admin Shop Intake Platform Modification & Manual Approval: Added platform selection dropdown to the admin console shop intake view (
POST /api/v1/admin/source-intakes/{id}/platform), allowing administrators to switch an intake's platform type directly (e.g. fromothertoldxp,dujiao_next,16688,woocommerce,merchant_json,schema_org). - On-Demand Platform Re-Detection: Added
POST /api/v1/admin/source-intakes/{id}/redetectto re-trigger automatic platform detection for an intake using the latest detection rules. - Intelligent Platform Auto-Upgrade on Approval: Enhanced
POST /api/v1/admin/source-intakes/{id}/approveto automatically recognize supported platform URLs (such aswzyp.cn->ldxp) and approve them directly without throwing 409 errors.
- Source Detector LDXP Domain Coverage: Updated
detector/probe.pyto includewzyp.cnandwww.wzyp.cninLDXP_HOSTS, preventing new store applications onwzyp.cn(like shop#37) from being misclassified as其他独立站(other).
- No database schema migrations required.
- Existing and future
wzyp.cnshop intakes can be approved and validated seamlessly.
- Follow
docs/QUICK_DEPLOY.mdand deploy only tagv3.7.31after CI passes. - Rebuild
api,web, andsource-detector.
- Detail-Driven Classification & Brand Detection: Enabled brand and tier recognition fallback to product detail page descriptions (
raw_products.raw_json->>'description') when storefront titles are cryptic or non-standard. - Universal Non-Product Exclusion: Systematically rejected pure tutorials (
教程,保姆教程,图文教程,反代教程), test items (测试商品,不要拍,不可拍), SMS verification ad services (接码渠道), virtual cards (虚拟卡,0刀卡), and referral boost links from being classified into subscription products. - Reverse Proxy / Sub2API Token Isolation: Offers offering only Sub2API/RT JSON tokens without login credentials (
只能反代,无账号密码) are now correctly classified ascodex-access(session_token) rather thanchatgpt-plus. - ChatGPT Pro Integrity: Filtered out team bug sub-accounts (
Team bug 子号) and API quota credits (20X 额度|50美金) fromchatgpt-proandchatgpt-pro-20x. - Multi-User Carpool Isolation: Expanded
SHARED_POOL_MARKERSto catch拼车,共享账号,多人共享, and车位, ensuring carpool offers are taggedshared_poolandis_comparable = false, preventing them from distorting individual account comparison prices. - Category Group False Positives: Preserved genuine subscriptions in merchant storefront categories ending in
分组(e.g.Grok分组).
- Synchronized
apps/api/app/services/classifier.pyandpipeline/common.py. - No database schema migrations required.
- Follow
docs/QUICK_DEPLOY.mdand deploy only tagv3.7.30after CI passes. - Rebuild
api,web, andimporter.
- Added admin console tabs for reviewing restricted (
status=restricted) and unclassified (status=unclassified) offers, with live count badges on the stats bar. - Added admin search and target product filter to the offer management table.
- Added support for manual reclassification (including unclassifying back to
None) and single-offer auto-reclassification viaPOST /api/v1/admin/offers/{id}/reclassify. - Added visual display of merchant original category and restriction / hidden reasons in the admin offer view.
- Strengthened classifier and pipeline normalization to reject API relay groups (e.g.
plus分组), relay model channels (e.g.(cx,5,4)), and non-20 dollar credit quotas from being falsely classified aschatgpt-plus,chatgpt-pro, orcodex-access.
- No schema migrations required.
- Existing restricted offers can now be inspected, audited, and reclassified directly from
/admin.
- Follow
docs/QUICK_DEPLOY.mdand deploy only tagv3.7.29after CI passes. - Rebuild
api,web, andimporter.
- Added support for
wzyp.cnandwww.wzyp.cnstorefront hostnames in theldxpplatform detector and crawler normalization. - Added
https://wzyp.cn/shop/KFLAto public source discovery seeds and crawler candidate database. - Added
wzyp.cnguidance to source intake copy in the web application.
- Preserves
token.casefold()assource_keyandtokenasshop_tokenunder theldxpplatform namespace. - No database migration is required.
- Follow
docs/QUICK_DEPLOY.mdand deploy only tagv3.7.28after CI passes. - Rebuild
api,source-detector,web,importer, andcrawler.
- Preserved the flat token-list contract of
GET /api/v1/shopsand added a paginated shop-card endpoint for directory pages. - Excluded hidden products and shops without current public offers from public metadata, source pages, and sitemap entries; added pagination for shop directories.
- Unified API and pipeline 16688 classification with source-category context, rejected non-product aliases, and retained valid API-credit classification.
- Rotated 16688 discovery categories within the global page budget so one category cannot starve the others.
- The 16688 default approval behavior is unchanged: newly discovered offers still follow the existing approval policy.
- No database migration is required.
- Follow
docs/QUICK_DEPLOY.mdand deploy only tagv3.7.24after CI passes. - Rebuild
api,source-detector,web,importer, andcrawler. - Run one complete multi-source refresh because the release changes crawler and pipeline behavior.
- Enforced attempt matching before accepting an idempotent LDXP onboarding response, so a stale onboarding report cannot be mistaken for a retry of the current attempt.
- Prevented completed LDXP intake attempts from being re-reported on later inventory scans, eliminating false production
409errors while retaining the metadata required for publication onboarding. - Made same-attempt scan-result retries idempotent after an intake reaches a closed state; a newer attempt remains rejected as stale.
- Restored LDXP application onboarding after a successful atomic multi-source snapshot, so validated applications with public offers are marked as published.
- 16688 discovery now uses the platform's public AI source marketplace to resolve public goods to canonical
/shop/{shop_no}URLs before the existing detector and review flow. - Unified source discovery now runs before legacy Dujiao revalidation, and the 16688 and Common Crawl adapters run before the high-volume Bing adapter so Bing cannot consume their discovery opportunity.
- Updated Common Crawl discovery regression coverage for the new platform-reserved budget semantics.
- Scheduled unified source discovery now obtains its worker key inside the Compose crawler container instead of incorrectly requiring the systemd host service to load the production
.env. - Common Crawl discovery reserves candidate capacity for 16688, so high-volume LDXP URLs cannot consume the complete run budget before 16688 shop paths are queried.
- The isolated source detector now falls back to another already-validated public DNS address when an initial socket connection fails, allowing 16688 sources to work on IPv4-only egress networks that resolve IPv6 first.
- A successful fallback address is pinned for the rest of the detection run without re-resolving DNS or weakening the existing public-address and TLS hostname checks.
- Added public 16688 shop intake, source detection, approval, atomic publication, and the
16688connector for public shop and goods APIs. - Normalized 16688 aliases such as
/shop/HARVEYto the canonical shop number and scoped shop tokens and product keys by platform so same-named shops do not collide. - Extended automatic discovery through Bing and Common Crawl for 16688 shop URLs, while keeping discovery auto-approval disabled by default.
- Added the v11 database constraint migration for 16688 source intakes and discovery candidates.
- Refreshed the full Web experience with the Signal Ledger visual system, clearer hierarchy, more consistent typography, responsive layouts, and unified interaction states.
- Reworked public-facing copy to describe observed prices and data freshness more precisely across product, guide, watchlist, submission, policy, and administration surfaces.
- Connected catalog search terms to the public catalog API and preserved available offers when product metadata is incomplete.
- Each shop scan now runs inside a supervised browser Worker with a hard wall-clock deadline. A wedged Playwright page or renderer is terminated with its Chromium process group, recorded as a transient failure, and scanning continues with a fresh browser.
- The crawler now stores only current matches and run summaries. The unused per-scan
product_snapshotshistory no longer grows the operational SQLite database and delays each publication copy. - Ten-minute inventory refreshes now update only LDXP data while carrying other published sources forward, so a transient external-source timeout cannot block inventory publication.
- Compact publication uses a deferred SQLite transaction so the production SQLite runtime does not request a write lock on the attached read-only crawler database.
- The compact crawler publication helper now runs on the production host's Python 3.6 runtime.
- Scheduled publication now copies only the three current crawler tables used by the publisher instead of validating, copying, and revalidating the full multi-gigabyte history database on every refresh.
- Persistent Chromium teardown now stops the Playwright connection directly instead of waiting indefinitely for
BrowserContext.close()after all shops were scanned.
- Browser-replayed shop API requests now abort at the configured crawler timeout instead of allowing one unresponsive source to block every later scan and publication.
- Browser refreshes remove stale Chromium singleton symlinks left by a terminated crawler, and inventory refreshes receive a one-hour service budget so a completed scan can finish atomic publication.
- Release metadata is aligned on
3.7.6across the API, Web package, lockfile, and repository version marker.
- Restored text and icon color utilities on form controls so dark action buttons remain readable.
- Redesigned the Web pages around a unified product, catalog, offer, guide, and source-review UI system.
- Reworked public copy to distinguish current observations from live data, separate empty and unavailable states, and remove internal workflow wording from user-facing surfaces.
- Clarified watchlist/Atom subscription behavior, correction privacy, offer grouping, information coverage, and source intake outcomes.
- Restored the public author-support entry and kept the existing community prompt wording unchanged.
- Restored support QR configuration defaults for local and production Web builds.
- Updated admin actions and source-discovery labels so buttons describe the action instead of repeating the current state.
- LDXP sources in
blockedorchallenge_requiredno longer remain permanently excluded after a transient source-level challenge. - Blocked sources receive bounded retry times and can be forced immediately with
--retry-blocked; consecutive source-level failures still stop the scan through the existing circuit breaker. - Regression coverage now verifies that an all-blocked batch is recorded as failed rather than successful.
- Crawler self-tests and pytest coverage now run in CI.
- Unified source discovery engine: seed/Bing/GitHub/Common Crawl adapters submit normalized candidates to a PostgreSQL candidate pool (
source_discovery_runs,source_candidates, v10 migration). - Source Detector qualification of discovered candidates with bounded public samples and AI product classification, plus strict auto-approval for Dujiao-Next and WooCommerce and manual review for Schema.org and Merchant JSON.
- Internal candidate claim/lease/result APIs, idempotent promotion into
source_intakes, and admin discovery funnel/controls. - Production Dujiao discovery now runs GitHub sources with optional token, full AI keywords, and env-driven budgets.
- WooCommerce Store API connector with exact minor-unit pricing, complete pagination validation, and safe variation fallback.
- Schema.org sitemap and product-page JSON-LD connector with bounded discovery and same-origin HTTPS validation.
- Dujiao-Next qualified candidates are auto-approved, and GitHub public repository homepages are a new passive discovery source.
- Source intake, detector, pipeline publication, Web labels, and a v9 database migration for the new source platforms.
- Detector platform probing order is now Dujiao-Next, WooCommerce, Merchant JSON, then Schema.org.
- Directly submitted sitemap and product-page URLs are preserved exactly through detection and publication.
- WooCommerce products that are not purchasable never count as in-stock or enter lowest-price comparisons.
- Dujiao-Next connector support with brand-aware shop metadata, paginated products, variants, currency preservation, and reviewed-source publication.
- Public-fingerprint discovery with bounded candidate quotas, stale revalidation, isolated platform detection, and administrator-controlled intake routing.
- Merchant JSON intake publication and persistent multi-source refresh across LDXP, Dujiao-Next, and approved merchant feeds.
- Complete catalog publication is atomic across all sources and now runs in the dedicated Importer image.
- Intake publication distinguishes raw records, classified offers, and fresh public offers; only a truly visible offer marks a source as published.
- Published sources remain in later complete refreshes, while disabled or review-required sources leave the next snapshot.
- Product brand and source platform are exposed separately across the API and Web application.
- Detector, Pipeline connectors, and Dujiao discovery share a bounded HTTPS client that pins validated public IPs while preserving TLS SNI and certificate verification.
- Public intake submissions no longer fetch user-controlled URLs inside the API process; the Detector has no database credentials or default-network access.
- Merchant feed shop identity is derived from the canonical feed URL, and public shop/product links reject credentials, fragments, control characters, and non-HTTPS schemes.
- Detector egress is designed for a production firewall policy that permits only public TCP/443 destinations.
- Optional GitHub Star and author-support entry points in the public footer.
- Low-frequency, session-aware community prompts that stay disabled on administrator and shop-submission routes.
- Accessible WeChat Pay and Alipay support dialog with keyboard dismissal and mobile layouts.
- Production Web containers can mount support QR images from
data/supportas read-only runtime assets. - Production preflight validates both public HTTPS QR URLs whenever author support is enabled.
- Payment QR images and production support configuration remain outside the public Git repository.
- The support dialog does not display or configure a payee name and never records payment information.
- Administrator intake emails now include a direct link to the matching review item in the admin panel.
- Final onboarding emails now include the published public shop page.
- Admin intake links still require the administrator key, then scroll to and highlight the referenced request after authentication.
- Administrator links contain only the intake identifier and never include the administrator key.
- Durable shop-intake records with explicit review, validation, onboarding, rejection, and retry states.
- Admin controls for approving, rejecting, retrying, and inspecting source-intake notification delivery.
- Applicant and administrator email notifications through Resend, with SMTP fallback and a transactional outbox worker.
- LDXP intake bridges for crawler and pipeline jobs, protected by a dedicated worker credential and leased claims.
- Idempotent
migrate_shop_intake_v6.pymigration for historical shop requests and notification outbox storage.
- Shop submissions now require a valid contact email and return a stable request identifier for duplicate requests.
- Production preflight now requires administrator recipients, a separate intake-worker key, and a complete Resend or SMTP configuration.
- Production Compose and deployment guidance now include the notification worker and the v6 intake migration.
- Intake-worker access is isolated from the administrator API key.
- Source validation failures are sanitized before storage or email delivery.
- Resend credentials remain environment-only and are never written to application logs.
- Rewrote homepage, catalog, product-detail, About, methodology, shop, watchlist, and footer copy in user-facing language.
- Replaced internal pricing and crawler terminology with clearer descriptions such as recent in-stock low, common price, quote coverage, and source update status.
- Simplified grouped-offer labels, anomaly warnings, source links, update timestamps, and product FAQs without changing pricing or ranking behavior.
- Official price references, verification dates, product data-quality scores, source scan-health facts, and daily aggregated price/stock trends.
- Browser-local watchlists and privacy-preserving Atom price/restock subscriptions.
- Public methodology, privacy, terms, security, developer, and correction-log pages.
- Public correction summaries with optional merchant responses while keeping reporter contacts private.
- Generic connector protocol, merchant HTTPS JSON Feed importer, submission flow, fixtures, and tests.
- Full delivery, period, warranty, fulfillment, freshness, stock, and price-range filters across catalog and product pages.
- Default catalog ranking now prioritizes data quality and freshness before price.
- Homepage and directory counters use one published-snapshot scope and show trusted/comparable context.
- Price history presentation uses daily aggregates instead of connecting unrelated raw observations.
- Source-health labels explicitly describe crawler availability rather than merchant reputation.
- Merchant Feed submissions require public HTTPS URLs and reject localhost, internal hostnames, and private/reserved IP literals.
- Public correction endpoints exclude raw report messages and contact information.
- Trusted-price scoring derived from comparable inventory and delivery-type medians.
trusted_offer_countandmedian_pricein public product responses.- Per-offer
is_trusted_priceindicator while retaining anomaly warnings. - API pricing unit tests and GitHub Actions checks for API and Web builds.
- Version, security, contribution, and release documentation.
- Product cards and product details now use the trusted lowest price as the primary price.
- Extremely low or strongly off-median offers remain visible as source evidence but no longer lead the primary ranking.
- Related/all-in-stock lowest price remains available through
related_lowest_pricefor backward compatibility. - Homepage copy now distinguishes trustworthy rankings from raw low prices.
- Product structured data reports trusted offers rather than every comparable offer.
- Prevented ¥0.01 promotion, balance, trial, or restricted offers from becoming the headline price.
- Prevented anomalous representatives from being selected ahead of trustworthy offers inside grouped results.
- Initial public architecture with FastAPI, Next.js, snapshots, classification, grouping, and price history.