Getting started

Free trial and credits

The free trial

Every new account gets a 14-day trial, starting when you verify your email address:

  • Pro limits: up to 600 DPI, 100 MB files, 500 pages per job and 3 jobs at a time.
  • 100 credits, which expire when the trial ends.
  • No card needed and no automatic charge.
  • One trial per workspace and per email address.

There's nothing special to do in your code: the same API and keys work during and after the trial. We email you when it starts, 3 days and 1 day before it ends, and when it ends. Then your workspace moves to the Free plan (25 credits a month) unless you've chosen a plan.

How credits work

The same credits are used on the web, in the desktop app and through the API. Each page that converts costs credits according to its resolution:

DPICredits per pageExample: 20-page PDF
Up to 150120 credits
151 to 300360 credits
301 to 6008160 credits
  1. After counting the pages, the worker reserves the credits. If you don't have enough, the job fails with insufficient_credits and nothing is charged.
  2. After converting, only the pages that succeeded are charged. The rest go back to your balance.

So a 20-page job at 300 DPI where 19 pages convert costs 19 × 3 = 57 credits.

Where credits come from

SourceAmountExpires
Trial100, onceWhen the trial ends
Free plan25 each calendar monthAt the end of the month
Paid planYour plan's credits, each billing periodEnd of the period, plus one day

The batch that expires soonest is always used first, so you lose as little as possible. Unused credits don't roll over. There are no overage charges: when credits run out, new jobs simply fail with insufficient_credits.

Checking your plan and balance

GET /v1/usage needs a key with the usage:read scope.

<?php
$api = getenv('RASTERNIVO_API_URL') ?: 'https://rasternivo-api.swiftinfocorp.com/v1';

$ch = curl_init("$api/usage");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('RASTERNIVO_API_KEY')],
]);
$usage = json_decode(curl_exec($ch), true);

echo $usage['plan']['name'], ' (', $usage['plan']['source'], '): ',
     $usage['credits']['available'], " credits available\n";
import os
import requests

API = os.environ.get("RASTERNIVO_API_URL", "https://rasternivo-api.swiftinfocorp.com/v1")

usage = requests.get(
    f"{API}/usage",
    headers={"Authorization": "Bearer " + os.environ["RASTERNIVO_API_KEY"]},
).json()

print(f"{usage['plan']['name']} ({usage['plan']['source']}): "
      f"{usage['credits']['available']} credits available")
const API = process.env.RASTERNIVO_API_URL ?? "https://rasternivo-api.swiftinfocorp.com/v1";

const res = await fetch(`${API}/usage`, {
  headers: { Authorization: `Bearer ${process.env.RASTERNIVO_API_KEY}` },
});
const usage = await res.json();

console.log(`${usage.plan.name} (${usage.plan.source}): ${usage.credits.available} credits available`);
curl "https://rasternivo-api.swiftinfocorp.com/v1/usage" \
  -H "Authorization: Bearer $RASTERNIVO_API_KEY"
{
  "plan": { "code": "pro", "name": "Pro", "source": "trial" },
  "credits": {
    "available": 100,
    "held": 0,
    "consumed_last_30_days": 0,
    "lots": [
      { "source": "trial", "remaining": 100, "granted": 100,
        "granted_at": "2026-11-02T08:31:49Z", "expires_at": "2026-11-16T08:31:49Z" }
    ]
  },
  "credit_weights": [
    { "max_dpi": 150, "credits_per_page": 1 },
    { "max_dpi": 300, "credits_per_page": 3 },
    { "max_dpi": 600, "credits_per_page": 8 }
  ],
  "limits": {
    "max_active_jobs": 3, "max_dpi": 600, "max_pages_per_job": 500,
    "max_upload_bytes": 104857600, "result_ttl_seconds": 3600
  }
}
FieldMeaning
plan.sourceWhy this plan applies: subscription, trial or free
credits.availableWhat you can spend now
credits.heldReserved by jobs that are still running
credits.lotsEach batch of credits, with what's left and when it expires
limitsThe limits that apply to this key's workspace right now

Trial dates are in GET /v1/billing, which needs a signed-in session; see Plans and billing.

Seeing where credits went

The Credit log in your dashboard lists every conversion with where it came from, its file and what it cost. To read it from your own code, use GET /v1/activity.

<?php
$api = getenv('RASTERNIVO_API_URL') ?: 'https://rasternivo-api.swiftinfocorp.com/v1';

$ch = curl_init("$api/activity?limit=20");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('RASTERNIVO_API_KEY')],
]);
$data = json_decode(curl_exec($ch), true);

foreach ($data['activity'] as $entry) {
    echo $entry['at'], ' ', $entry['channel'] ?? $entry['kind'], ' ', $entry['amount'], ' ', $entry['balance_after'], "\n";
}
import os
import requests

API = os.environ.get("RASTERNIVO_API_URL", "https://rasternivo-api.swiftinfocorp.com/v1")

data = requests.get(
    f'{API}/activity?limit=20',
    headers={"Authorization": "Bearer " + os.environ["RASTERNIVO_API_KEY"]},
).json()

for entry in data["activity"]:
    print(entry["at"], entry["channel"] or entry["kind"], entry["amount"], entry["balance_after"])
const API = process.env.RASTERNIVO_API_URL ?? "https://rasternivo-api.swiftinfocorp.com/v1";

const res = await fetch(`${API}/activity?limit=20`, {
  headers: { Authorization: `Bearer ${process.env.RASTERNIVO_API_KEY}` },
});
const data = await res.json();

for (const entry of data.activity) {
  console.log(entry.at, entry.channel ?? entry.kind, entry.amount, entry.balance_after);
}
curl "https://rasternivo-api.swiftinfocorp.com/v1/activity?limit=20" \
  -H "Authorization: Bearer $RASTERNIVO_API_KEY"