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

Overview
Section titled “Overview”AppStoreCat discovers apps organically through user interactions. Every search, chart view, or publisher page visit can introduce new apps to the system.
Discovery Sources
Section titled “Discovery Sources”| Source | How It’s Triggered |
|---|---|
| Search | Searching for apps returns store results and creates records |
| Trending | Daily chart sync automatically discovers the most popular apps |
| Publisher Apps | Viewing a publisher’s app catalog discovers their apps |
| Registration | Explicitly registering an app via the API |
| Import | Bulk importing all of a publisher’s apps |
| Direct Visit | Visiting 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.
How It Works
Section titled “How It Works”- The user performs an action (search, view charts, visit publisher)
- The backend calls the appropriate scraper to fetch store data
App::discover()creates a new app record with adiscovered_fromtag- The app waits for the next
appstorecat:apps:sync-trackedtick, which picks it up in the competitor/backlog tier and dispatches aSyncAppJobontosync-tracked-{platform} - The sync is tracked phase-by-phase in the
sync_statusestable (identity → listings → metrics → finalize → reconciling); if the identity phase fails, the entire pipeline stops and the app is marked “unavailable”
Search
Section titled “Search”GET /api/v1/apps/search?term=instagram&platform=ios&country_code=USSearches 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
Technical Details
Section titled “Technical Details”- 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 otheron_*keys;on_direct_visitdefaults tofalse) - 404 contract: Scrapers return 404 when an app is not found in a store; such cases are handled later by
ReconcileFailedItemsJobviasync_statuses.failed_items.