Skip to content

App Discovery

Discover new apps via search, trending charts, publisher pages, and more.

App Discovery

AppStoreCat discovers apps organically through user interactions. Every search, chart view, or publisher page visit can introduce new apps to the system.

SourceHow It’s Triggered
SearchSearching for apps returns store results and creates records
TrendingDaily chart sync automatically discovers the most popular apps
Publisher AppsViewing a publisher’s app catalog discovers their apps
RegistrationExplicitly registering an app via the API
ImportBulk importing all of a publisher’s apps
Direct VisitVisiting an app by its store ID (disabled by default)

Each source can be enabled/disabled per platform under the discover key in config/appstorecat.php. on_direct_visit is disabled by default — if you go directly to an app URL that does not exist in the database, the API returns 404.

  1. The user performs an action (search, view charts, visit publisher)
  2. The backend calls the appropriate scraper to fetch store data
  3. App::discover() creates a new app record with a discovered_from tag
  4. The app waits for the next appstorecat:apps:sync-tracked tick, which picks it up in the competitor/backlog tier and dispatches a SyncAppJob onto sync-tracked-{platform}
  5. The sync is tracked phase-by-phase in the sync_statuses table (identity → listings → metrics → finalize → reconciling); if the identity phase fails, the entire pipeline stops and the app is marked “unavailable”
GET /api/v1/apps/search?term=instagram&platform=ios&country_code=US

Searches the store in real time via the scraper and returns matching apps. Results are normalized across both platforms. country_code is a two-letter ISO code validated against countries.code.

Go to Discovery > Apps to search for apps. The UI offers:

  • Debounced search input
  • Platform picker (iOS / Android)
  • Country picker
  • Results with app icon, name, publisher, and rating
  • Controller: AppSearchController
  • Connectors: fetchSearch() on both connectors
  • Sync queue: sync-tracked-ios / sync-tracked-android (no separate discovery lane; discovered apps ride the scheduler’s fallback tiers)
  • Configuration: appstorecat.discover.{platform}.on_search (and the other on_* keys; on_direct_visit defaults to false)
  • 404 contract: Scrapers return 404 when an app is not found in a store; such cases are handled later by ReconcileFailedItemsJob via sync_statuses.failed_items.