Merchrocket.Client
2.1.0
dotnet add package Merchrocket.Client --version 2.1.0
NuGet\Install-Package Merchrocket.Client -Version 2.1.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Merchrocket.Client" Version="2.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Merchrocket.Client" Version="2.1.0" />
<PackageReference Include="Merchrocket.Client" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Merchrocket.Client --version 2.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Merchrocket.Client, 2.1.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Merchrocket.Client@2.1.0
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Merchrocket.Client&version=2.1.0
#tool nuget:?package=Merchrocket.Client&version=2.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Merchrocket .NET Client
A comprehensive, strongly-typed .NET client library for the Merchrocket print-on-demand API.
Features
- Typed API - Catalog Products, Variants, Mockup Tasks, Orders, Order Items, Shipments, Statistics, Users
- Error handling - Every call returns
ApiResponse<T>;ThrowOnError(default) additionally raisesMerchrocketApiExceptionon failure - Credit tracking -
X-MR-Credits-Included/X-MR-Credits-Usedheaders extracted automatically - Pagination - Hydra collections with
page,itemsPerPage,totalItems, navigation links - DI-ready -
AddMerchrocketClient()extension registers all services - Multi-targeting -
net8.0,net9.0,net10.0 - Logging - Structured via
Microsoft.Extensions.Logging; HTTP errors always logged at Warning
Installation
dotnet add package Merchrocket.Client
Getting Started
using Merchrocket.Client.Extensions;
using Merchrocket.Client.Models.Config;
builder.Services.AddMerchrocketClient(new MerchrocketConfig
{
BaseUrl = "https://app.merchrocket.shop/api/",
AccessToken = "mrp_your_access_token",
ThrowOnError = true, // default: throws MerchrocketApiException on errors
RequestLogging = false // set true for per-request Info-level logging
});
Inject IMerchrocketClient into your services:
public class MyService(IMerchrocketClient client)
{
public async Task DoSomething()
{
var orders = await client.Order.GetOrdersAsync();
// ...
}
}
Every endpoint returns ApiResponse<T>. The ThrowOnError config flag only controls whether failures also throw.
Default mode (ThrowOnError = true) - failures throw, so you can access .Data directly:
try
{
var response = await client.Order.GetOrderAsync("bad-id");
var order = response.Data;
}
catch (MerchrocketApiException ex)
{
// ex.StatusCode, ex.ResponseBody, ex.RequestPath
}
Opt-in mode (ThrowOnError = false) - failures never throw; inspect the response:
var response = await client.Order.GetOrderAsync("bad-id");
if (!response.IsSuccess)
{
// response.Error.StatusCode, response.Error.ResponseBody
}
ApiResponse<T> property |
Description |
|---|---|
Data |
Deserialized body (valid when IsSuccess) |
IsSuccess |
true on 2xx |
Error |
StatusCode, ResponseBody, RequestPath on failure |
Credits |
CreditsIncluded / CreditsUsed from response headers |
Endpoint Reference
| Property | Resources |
|---|---|
client.CatalogProduct |
Products in your catalog |
client.CatalogProductVariant |
Variants (SKUs, placements, attributes) |
client.MockupTask |
Mockup generation jobs |
client.Order |
Orders, order items, shipments, transitions |
client.Statistics |
Monthly mockup usage statistics |
client.User |
User accounts |
Catalog Product
var products = await client.CatalogProduct.GetCollectionAsync();
var product = await client.CatalogProduct.GetAsync("e2c2e18c-...");
| Method | Endpoint |
|---|---|
GetCollectionAsync(page, itemsPerPage) |
GET /api/catalog-products |
GetAsync(id) |
GET /api/catalog-products/{id} |
Catalog Product Variant
var variants = await client.CatalogProductVariant.GetCollectionAsync(
"952b416d-...", withAllAttributes: true);
var variant = await client.CatalogProductVariant.GetAsync("0587b207-...");
// Typed attribute access
var sku = variant.TryGetAttributeValue<int?>(AttributeCodes.SupplierSku);
| Method | Endpoint |
|---|---|
GetCollectionAsync(productId, ...) |
GET /api/catalog-products/{id}/catalog-variants |
GetAsync(id) |
GET /api/catalog-product-variants/{id} |
Mockup Task
var request = new MockupTaskRequest
{
Format = MockupTaskFormats.JPEG,
RequestedProducts =
[
new RequestedProduct
{
CatalogProductId = "e2c2e18c-...",
Placements =
[
new Placement
{
Type = PlacementTypes.Main,
Technique = PlacementTechniques.DirectPrint,
Layers = [new Layer { Url = "https://example.com/design.png", Type = PlacementLayerTypes.File }]
}
]
}
]
};
var task = await client.MockupTask.PostMockupTask(request);
var id = task.Data!.MockupTaskId!;
// Poll until done
while (task.Data.Status == "pending")
{
await Task.Delay(5000);
task = await client.MockupTask.GetMockupTask(id);
}
// Access results
foreach (var vm in task.Data.CatalogVariantMockups!)
foreach (var m in vm.Mockups!)
Console.WriteLine(m.MockupUrl);
// Download all assets as ZIP
var zip = await client.MockupTask.DownloadMockupTaskAsync(id);
// List all tasks
var all = await client.MockupTask.GetMockupTasksAsync();
| Method | Endpoint |
|---|---|
GetMockupTasksAsync(page, itemsPerPage) |
GET /api/mockup-tasks |
PostMockupTask(request) |
POST /api/mockup-tasks |
GetMockupTask(id) |
GET /api/mockup-tasks/{id} |
DownloadMockupTaskAsync(id) |
GET /api/mockup-tasks/{id}/download |
Order
var order = await client.Order.CreateOrderAsync(new CreateOrderRequest
{
ExternalId = "SHOP-12345",
Shipping = "STANDARD",
Recipient = new Recipient { Name = "Max Mustermann", Address1 = "Musterstr. 1", City = "Berlin", CountryCode = "DE", Zip = "10115" },
OrderItems =
[
new CreateOrderItemRequest { ExternalId = "ITEM-001", Quantity = 1, VariantId = "0587b207-..." }
]
});
var orders = await client.Order.GetOrdersAsync();
var byId = await client.Order.GetOrderAsync(orderId);
var byExt = await client.Order.GetOrderAsync("@SHOP-12345");
await client.Order.PatchOrderAsync(orderId, new PatchOrderRequest { Shipping = "DHL_EXPRESS" });
await client.Order.ConfirmOrderAsync(orderId);
// await client.Order.CancelOrderAsync(orderId);
// await client.Order.RefundOrderAsync(orderId);
| Method | Endpoint |
|---|---|
GetOrdersAsync(...) |
GET /api/orders |
GetOrderAsync(id) |
GET /api/orders/{id} |
CreateOrderAsync(req) |
POST /api/orders |
PatchOrderAsync(id, req) |
PATCH /api/orders/{id} |
ConfirmOrderAsync(id) |
POST /api/orders/{id}/confirm |
CancelOrderAsync(id) |
POST /api/orders/{id}/cancel |
RefundOrderAsync(id) |
POST /api/orders/{id}/refund |
Order Items & Shipments
var items = await client.Order.GetOrderItemsAsync(orderId);
var item = await client.Order.GetOrderItemAsync(orderId, itemId);
var created = await client.Order.CreateOrderItemAsync(orderId, new CreateOrderItemRequest { Quantity = 2, VariantId = "..." });
await client.Order.PatchOrderItemAsync(orderId, itemId, new CreateOrderItemRequest { Quantity = 3 });
await client.Order.DeleteOrderItemAsync(orderId, itemId);
var shipments = await client.Order.GetShipmentsAsync(orderId);
| Method | Endpoint |
|---|---|
GetOrderItemsAsync(...) |
GET /api/orders/{orderId}/order-items |
GetOrderItemAsync(orderId, itemId) |
GET /api/orders/{orderId}/order-item/{id} |
CreateOrderItemAsync(orderId, req) |
POST /api/orders/{orderId}/order-items |
PatchOrderItemAsync(...) |
PATCH /api/orders/{orderId}/order-item/{id} |
DeleteOrderItemAsync(...) |
DELETE /api/orders/{orderId}/order-item/{id} |
GetShipmentsAsync(orderId) |
GET /api/orders/{orderId}/shipments |
Statistics & Users
var stats = await client.Statistics.GetMonthlyMockupStatsAsync("2026");
var users = await client.User.GetCollectionAsync();
var user = await client.User.GetAsync(userId);
await client.User.DeleteAsync(userId);
Constants
MockupTaskFormats.JPEG // "jpeg"
PlacementTypes.Main // "main"
PlacementTechniques.DirectPrint // "direct_print"
PlacementTechniques.Engraving // "engraving"
PlacementLayerTypes.File // "file"
AttributeCodes.SupplierSku // "supplierSku"
Key Models
| Model | Key Properties |
|---|---|
CatalogProduct |
ProductId, Name, Brand, Image, VariantCount |
CatalogProductVariant |
VariantId, Sku, Placements, Options, InStock, Attributes |
MockupTaskRequest / MockupTask |
Format, RequestedProducts / Status, CatalogVariantMockups, FailureReasons |
CreateOrderRequest / Order |
ExternalId, Shipping, Recipient, OrderItems / Status, Shipments, Errors |
CreateOrderItemRequest / OrderItem |
Quantity, VariantId, Placements / ItemId, Errors, Images |
Recipient |
Name, Address1, City, CountryCode, Zip, Email |
ShipmentInfo |
Carrier, TrackingId, TrackingUrl, ShipmentStatus |
User |
UserId, Email, Roles, IsOnline |
API Coverage
| Resource | GET collection | GET single | POST | PATCH | DELETE | Special |
|---|---|---|---|---|---|---|
| CatalogProduct | ✅ | ✅ | - | - | - | |
| CatalogProductVariant | ✅ | ✅ | - | - | - | |
| MockupTask | ✅ | ✅ | ✅ | - | - | Download |
| Order | ✅ | ✅ | ✅ | ✅ | - | confirm, cancel, refund |
| OrderItem | ✅ | ✅ | ✅ | ✅ | ✅ | |
| Shipment | ✅ | - | - | - | - | |
| Statistics | ✅ | - | - | - | - | |
| User | ✅ | ✅ | - | - | ✅ |
License
MIT - see LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net10.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.8)
- Microsoft.Extensions.Http (>= 10.0.8)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.8)
-
net8.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.8)
- Microsoft.Extensions.Http (>= 10.0.8)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.8)
-
net9.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.8)
- Microsoft.Extensions.Http (>= 10.0.8)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.8)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.1.0 | 86 | 7/24/2026 |
| 2.0.0 | 107 | 7/20/2026 |
| 2.0.0-ci.14 | 162 | 7/21/2026 |
| 2.0.0-ci.13 | 48 | 7/21/2026 |
| 2.0.0-ci.12 | 42 | 7/20/2026 |
| 2.0.0-ci.10 | 47 | 7/20/2026 |
| 2.0.0-ci.9 | 495 | 5/15/2026 |
| 2.0.0-ci.8 | 58 | 5/6/2026 |
| 1.0.0 | 2,004 | 6/25/2025 |