> For the complete documentation index, see [llms.txt](https://easyauth.papelship.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://easyauth.papelship.com/csharp-document/main-functions/pe-product-loader.md).

# Pe Product Loader

The Modular Product Loader enables dynamic, multi-product multi-tenant architectures. Instead of compiling separate loader binaries for each software product you offer, a single loader can query available products from the server and launch specific product modules on demand.

## Overview

```mermaid
graph LR
    A[Authenticated Client] --> B[qPapelEasyAuth.GetProducts]
    B --> C{User Selects Product}
    C -->|Product A| D[LoadProductAsync("prod_cheat_apex")]
    C -->|Product B| E[LoadProductAsync("prod_bot_trader")]
    D --> F[Reflective Module Execution]
    E --> F
```

## C# Implementation

{% tabs %}
{% tab title="Fetch Product List" %}

```csharp
using System;
using System.Collections.Generic;
using qPapelEasyAuth;

public class ProductManager
{
    public static void ListAvailableProducts(string licenseKey, string apiKey)
    {
        Console.WriteLine("[*] Fetching assigned products for this license...");

        List<ProductInfo> products = qPapelEasyAuth.qPapelEasyAuth.GetProducts(licenseKey, apiKey);

        if (products.Count == 0)
        {
            Console.WriteLine("[-] No active products found for this license.");
            return;
        }

        Console.WriteLine($"[+] Found {products.Count} product(s):\n");
        for (int i = 0; i < products.Count; i++)
        {
            Console.WriteLine($"[{i + 1}] ID: {products[i].ProductId}");
            Console.WriteLine($"    Name        : {products[i].Name}");
            Console.WriteLine($"    Version     : {products[i].Version}");
            Console.WriteLine($"    Access Level: {products[i].AccessLevel}");
            Console.WriteLine($"    Description : {products[i].Description}\n");
        }
    }
}
```

{% endtab %}

{% tab title="Load & Execute Product" %}

```csharp
public static bool LaunchSelectedProduct(string productId, string licenseKey, string apiKey)
{
    Console.WriteLine($"[*] Initializing product '{productId}'...");

    bool loaded = qPapelEasyAuth.qPapelEasyAuth.LoadProduct(productId, licenseKey, apiKey);

    if (loaded)
    {
        Console.WriteLine("[+] Product module initialized and ready.");
        return true;
    }

    Console.WriteLine("[-] Failed to load product module.");
    return false;
}
```

{% endtab %}
{% endtabs %}

## `ProductInfo` Model

| Property      | Type     | Description                                            |
| ------------- | -------- | ------------------------------------------------------ |
| `ProductId`   | `string` | Unique product identifier slug (e.g. `prod_001_core`). |
| `Name`        | `string` | Display name of the product.                           |
| `Version`     | `string` | Current production version string.                     |
| `Description` | `string` | Product summary description.                           |
| `AccessLevel` | `string` | Permission tier (e.g. `standard`, `vip`, `developer`). |

{% hint style="info" %}
Product availability is filtered automatically on the server based on the entitlements attached to the user's license key.
{% endhint %}
