Skip to content

App Store Scraper Service

A stateless Node.js microservice that fetches app data from the Apple App Store.

ComponentTechnology
FrameworkFastify 5
LanguageTypeScript
Scraperapp-store-scraper
API documentation@fastify/swagger + Swagger UI
MethodRouteDescription
GET/healthHealth check
GET/chartsChart rankings (top free / paid / grossing)
GET/apps/searchSearch apps by term
GET/apps/:appId/identityApp identity and metadata
GET/apps/:appId/listingsStore listing for one country
GET/apps/:appId/listings/localesListings for multiple countries
GET/apps/:appId/metricsRating and metrics
GET/developers/:developerId/appsDeveloper’s app catalog
GET/developers/searchSearch developers
  • collection (required): top_free, top_paid, top_grossing
  • category: App Store genre ID (optional)
  • country: ISO country code (default: us)
  • num: result count (default: 200, max: 200)
  • term (required): search query (min 1 character)
  • limit: maximum results (default: 10, max: 50)
  • country: ISO country code (default: us)
  • country: ISO country code (default: us)
  • lang: language code (optional)

The identity response conveys paid/free info as an is_free boolean.

  • The promotional_text field (iOS-specific) is part of the response.

All endpoints return JSON. Error responses use this format:

{
"error": "Error message",
"statusCode": 404
}

The sendScraperError() helper maps errors from app-store-scraper (Error instances or plain objects) to the correct HTTP status code:

  • 404 Not Found — the app is not available in the target storefront. The server side interprets this as “permanently not available in this country”.
  • 5xx — unexpected errors; retried on the server side.

Error cases are emitted as structured JSON logs.

Terminal window
make dev-ios # Start the service
make logs-ios # View logs

While the service is running, the Swagger UI is available at /docs.

  • Stateless: no database, no cache, no persistent state
  • Normalized responses: raw App Store data is normalized into consistent JSON structures
  • Error propagation: store errors (404, rate limit) are propagated with the correct HTTP status code; missing app = 404 (not 500)
  • Port: configurable via the PORT environment variable (default: 7462)