Skip to main content

.NET library for fetching app reviews from App Store Connect and Google Play. Supports pagination, filtering, and developer response data.

Total Downloads
357
357
Published
Jan 23, 2026
9mo ago

Get Started

dotnet add package AppReviewFetch --version 1.1.4
ProductVersions
.NET
net8.0

README

AppReviewFetch

Build NuGet Library NuGet CLI NuGet MCP Server

A .NET library, CLI tool, and MCP server for fetching app reviews from App Store Connect (with Google Play support in development).

📦 Installation

CLI Tool (Recommended for most users)

dotnet tool install -g AppReviewFetch.Cli

Then run from anywhere:

arfetch

MCP Server (For AI Assistants)

Access your app reviews directly from GitHub Copilot, Claude, and other AI assistants:

dotnet tool install -g AppReviewFetch.Mcp

For configuration instructions, visit: https://github.com/praeclarum/AppReviewFetch/tree/main/AppReviewFetchMcp#readme

Library (For .NET Developers)

dotnet add package AppReviewFetch

Or add to your .csproj:

<PackageReference Include="AppReviewFetch" />

🚀 Quick Start (CLI)

# Install globally
dotnet tool install -g AppReviewFetch.Cli

# Run the interactive REPL
arfetch

# Configure credentials
arfetch> setup

# List your apps
arfetch> list

# Fetch reviews
arfetch> fetch 123456789

Main CLI Commands

Command Aliases Description
setup Configure App Store Connect credentials
list l List all apps (excludes hidden)
fetch <query> [country] f Fetch reviews (supports app ID, bundle ID, or name)
help h, ? Show all commands

Query Support: Most commands accept flexible queries that can match:

  • App ID (e.g., 123456789)
  • Bundle/Package ID (e.g., com.example.app)
  • App Name (case-insensitive, partial match)

Examples:

fetch 123456789              # By app ID
fetch com.example.app        # By bundle ID
fetch "My App Name"          # By name

App Database

AppReviewFetch maintains a local database of apps at:

  • Windows: %LOCALAPPDATA%\AppReviewFetch\Apps.json
  • macOS/Linux: ~/.config/AppReviewFetch/Apps.json

This database:

  • Caches apps from API calls (App Store, Google Play)
  • Stores metadata like project URLs and notes
  • Supports manual entries for stores that can't list apps (e.g., Google Play)
  • Hides removed apps to keep listings clean

Use add-app to manually add apps, edit-app to set project URLs or hide apps, and delete-app to remove entries.

Setup

1. Get App Store Connect API Key

  1. Go to App Store Connect → Users and Access → Keys → App Store Connect API
  2. Generate or select an API key
  3. Note: Key ID, Issuer ID, and download the .p8 file

Required Role: Only Account Holders and Admins can generate API keys.

Required Key Access: When creating the key, assign one of these access levels:

  • App Manager - Full app management access (recommended)
  • Customer Support - Can view and respond to reviews
  • Sales - Can view reviews and analytics
  • Admin - Complete access to all features

Note: Developer, Marketing, and Finance roles do NOT have access to customer reviews.

2. Configure Credentials

Run arfetch setup or manually create:

Windows: %LOCALAPPDATA%\AppReviewFetch\Credentials.json
macOS/Linux: ~/.config/AppReviewFetch/Credentials.json

{
  "appStoreConnect": {
    "keyId": "YOUR_KEY_ID",
    "issuerId": "YOUR_ISSUER_ID",
    "privateKey": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"
  }
}

Library Usage

Add the package to your project:

dotnet add package AppReviewFetch

Fetch Reviews

using AppReviewFetch;

var service = new AppStoreConnectService();
var request = new ReviewRequest
{
    SortOrder = ReviewSortOrder.NewestFirst,
    Limit = 100,
    Country = "US" // Optional
};

var response = await service.GetReviewsAsync("YOUR_APP_ID", request);

foreach (var review in response.Reviews)
{
    Console.WriteLine($"{review.Rating}/5 - {review.Title}");
    Console.WriteLine(review.Body);
    
    if (review.DeveloperResponse != null)
        Console.WriteLine($"Reply: {review.DeveloperResponse.Body}");
}

List Apps

var apps = await service.GetAppsAsync();
foreach (var app in apps.Apps)
{
    Console.WriteLine($"{app.Name} ({app.Id})");
}

Pagination

var allReviews = new List<AppReview>();
var request = new ReviewRequest { Limit = 200 };

string? cursor = null;
do
{
    request.Cursor = cursor;
    var response = await service.GetReviewsAsync(appId, request);
    allReviews.AddRange(response.Reviews);
    cursor = response.Pagination.NextCursor;
} while (!string.IsNullOrEmpty(cursor));

Dependency Injection

services.AddHttpClient<IAppReviewService, AppStoreConnectService>();

API Reference

IAppReviewService

  • Task<ReviewPageResponse> GetReviewsAsync(string appId, ReviewRequest request)
  • Task<AppListResponse> GetAppsAsync()

ReviewRequest

  • ReviewSortOrder SortOrder - NewestFirst, OldestFirst, HighestRatingFirst, LowestRatingFirst, MostHelpful
  • string? Country - ISO 3166-1 alpha-2 country code
  • string? Cursor - Pagination cursor
  • int Limit - Results per page (default: 100)

AppReview

  • string Id, int Rating, string? Title, string? Body
  • string? ReviewerNickname, DateTimeOffset CreatedDate, string? Territory
  • ReviewResponse? DeveloperResponse

Exceptions

  • ApiErrorException - API errors (includes StatusCode, ErrorCode, ErrorDetail)
  • AuthenticationException - JWT authentication issues
  • CredentialsException - Credentials file problems

Features

  • ✅ JWT authentication with automatic token generation
  • ✅ List all accessible apps
  • ✅ Pagination support
  • ✅ Multiple sort orders and territory filtering
  • ✅ Developer response support
  • ✅ Interface-based (extensible for other stores)

License

MIT

Downloads by Version

Similar & Alternative Packages

Hand-picked matching NuGet libraries based on tags & ecosystem

Depended On By

Find packages that declare this package as a dependency. NuGet does not provide a reverse-dependency endpoint, so candidates are checked on demand.

Adoption Assessment

Assess this package against its supported frameworks, license, maintenance signals and dependency graph before making it a project standard.

Compatibility metadata lists 1 target framework; confirm the exact target used by your application.

Related Guides & Workflows

Learn how to evaluate, integrate, or audit this package in your .NET project.