Skip to main content

Overview

ReelMirror uses a credit-based billing system. You pre-load your account with credits, and each operation deducts from your balance.

Pricing

OperationCost
Sync$0.03 per API request (min. 3 per creator)
Image generation$0.32 per image
Video generation~$0.15 per second (duration-based)
Voice conversion~$0.005 per second (duration-based)
Generation costs are calculated based on the source post’s media type and duration. A post with 3 images costs ~0.96.Videogenerationscaleswithcliplengtha30secondvideocostsapproximately0.96. Video generation scales with clip length — a 30-second video costs approximately 4.85 (including the image clone, video processing, and voice conversion overhead).

Discount mode

Discount mode is a persona-level setting — enable it via PATCH /v1/personas/{id} with discount_mode: true. When enabled, all generation for that persona is discounted by 20%:
OperationDiscount cost
Image generation~$0.26 per image
Video generation~$0.12 per second

Checking Your Balance

curl https://reelmirror.com/api/v1/billing/balance \
  -H "Authorization: Bearer rm_YOUR_KEY"
Response:
{
  "data": {
    "balance_cents": 1050,
    "balance_dollars": "10.50",
    "auto_reload": false,
    "reload_amount_cents": null,
    "reload_threshold_cents": null
  }
}

Transaction History

View your transaction history with pagination:
curl "https://reelmirror.com/api/v1/billing/transactions?limit=10&offset=0" \
  -H "Authorization: Bearer rm_YOUR_KEY"
Response:
{
  "data": [
    {
      "id": "uuid",
      "amount_cents": -20,
      "operation_type": "generation",
      "description": "Generated content from source post",
      "created_at": "2025-01-15T12:00:00Z"
    }
  ],
  "count": 42
}
Positive amounts are credits (deposits, refunds). Negative amounts are debits (generation, sync, voice conversion).

Topping Up

Create a Stripe Checkout session to add credits:
curl -X POST https://reelmirror.com/api/v1/billing/topup \
  -H "Authorization: Bearer rm_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount_cents": 1000}'
Response:
{
  "url": "https://checkout.stripe.com/..."
}
Redirect the user to url to complete payment. Requires the billing:write scope.

Auto-Reload

Auto-reload automatically tops up your balance via Stripe when it falls below a threshold. This ensures uninterrupted API usage. When auto-reload is enabled and your balance drops below the threshold during an API operation, a reload is triggered automatically in the background.

Configuring auto-reload via API

Use PATCH /v1/billing/balance to configure auto-reload settings. Requires the billing:write scope. Enable auto-reload (card already on file). reload_amount_cents must be between 100 (1)and5000(1) and 5000 (50). reload_threshold_cents must be between 0 and 5000 ($50):
curl -X PATCH https://reelmirror.com/api/v1/billing/balance \
  -H "Authorization: Bearer rm_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "auto_reload": true,
    "reload_threshold_cents": 500,
    "reload_amount_cents": 2000
  }'
Response (card on file):
{
  "data": {
    "balance_cents": 1050,
    "balance_dollars": "10.50",
    "auto_reload": true,
    "reload_threshold_cents": 500,
    "reload_amount_cents": 2000
  }
}
Enable auto-reload (no card on file): If no payment method is saved, the API returns a Stripe Checkout setup URL instead of enabling auto_reload. Redirect the user to setup_url to save a card, then re-request:
{
  "auto_reload": false,
  "setup_url": "https://checkout.stripe.com/..."
}
Disable auto-reload:
curl -X PATCH https://reelmirror.com/api/v1/billing/balance \
  -H "Authorization: Bearer rm_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"auto_reload": false}'
Update thresholds only (without changing auto_reload):
curl -X PATCH https://reelmirror.com/api/v1/billing/balance \
  -H "Authorization: Bearer rm_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reload_threshold_cents": 1000, "reload_amount_cents": 5000}'

Insufficient Balance

If you attempt an operation without sufficient balance, the API returns a 402 error:
{
  "error": {
    "code": "INSUFFICIENT_BALANCE",
    "message": "Insufficient balance. Need $0.32, have $0.10.",
    "details": {
      "need_cents": 32,
      "have_cents": 10
    }
  }
}
Check your balance before triggering expensive operations to avoid failed requests.