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:
| DPI | Credits per page | Example: 20-page PDF |
|---|---|---|
| Up to 150 | 1 | 20 credits |
| 151 to 300 | 3 | 60 credits |
| 301 to 600 | 8 | 160 credits |
- After counting the pages, the worker reserves the credits. If you don't have enough, the job fails with
insufficient_creditsand nothing is charged. - 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
| Source | Amount | Expires |
|---|---|---|
| Trial | 100, once | When the trial ends |
| Free plan | 25 each calendar month | At the end of the month |
| Paid plan | Your plan's credits, each billing period | End 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
}
}| Field | Meaning |
|---|---|
plan.source | Why this plan applies: subscription, trial or free |
credits.available | What you can spend now |
credits.held | Reserved by jobs that are still running |
credits.lots | Each batch of credits, with what's left and when it expires |
limits | The 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"