Features
Everything Kondaino can do, plan by plan. No feature is held back behind a "contact sales" wall — if it's not on your plan, it's listed here so you know exactly what upgrading gets you.
| Feature | Free | Paid — $3.99/mo |
|---|---|---|
| Active links | 25 | 100,000 |
| Link expiry | 6 months (fixed) | Up to 24 months — pick your own date |
| Link groups / campaigns | Yes | Yes |
| Bulk CSV import | Yes (up to 200 rows/upload) | Yes (up to 200 rows/upload) |
| Click counts on your dashboard | Yes | Yes |
| One-click clipboard copy | Yes | Yes |
| API access (create/list links by token) | — | Yes |
| Credit card required | No | No — upgrade by email, cancel by email |
Every plan gets the same privacy guarantee: we only ever log a click count, never an IP address, device fingerprint, or referrer. See /about for the full pitch on pricing and privacy.
Link groups
Organize links into named groups — e.g. one per marketing campaign or newsletter issue — from the "Groups" section of your dashboard. Create, rename, and delete groups; assign a group when creating a link or importing a CSV; move an existing link between groups inline; and filter your links table down to a single group. Deleting a group never deletes its links — they just become ungrouped.
Bulk import
Upload a CSV with one URL per line and Kondaino creates a short link for each row, skipping a header row automatically if the first line isn't a URL. Optionally assign the whole batch to a group. Rows that would exceed your plan's link limit are reported as skipped rather than erroring out the whole upload.
Custom expiry dates (paid)
Free links always expire 6 months after creation. Paid accounts can instead pick any date up to 24 months out on the create-link form — useful for a campaign link that should outlive (or expire well before) the default window.
API (paid plan)
Generate a token from the "API access" section of your dashboard (shown once, at creation) and send it as a bearer token on every request:
Authorization: Bearer kdo_<token>
GET /api/links lists your active links.
POST /api/links creates one, accepting either
application/json or a form-encoded body with a
long_url field. Responses are JSON with a top-level
data key on success or error on failure. The API
obeys the same plan limits as the dashboard, since both call the same
underlying functions.
Python
import requests
API_TOKEN = "kdo_..."
API_URL = "https://kdourl.com/api/links"
headers = {"Authorization": f"Bearer {API_TOKEN}"}
# Create a short link
resp = requests.post(API_URL, headers=headers, json={
"long_url": "https://example.com/some/long/path",
})
resp.raise_for_status()
print(resp.json())
# {'data': {'id': 42, 'code': 'g', 'short_url': 'https://kdourl.com/g', 'long_url': '...'}}
# List your links
resp = requests.get(API_URL, headers=headers)
resp.raise_for_status()
for link in resp.json()["data"]:
print(link["short_url"], "->", link["long_url"], f"({link['clicks']} clicks)")
PHP
<?php
$token = 'kdo_...';
$apiUrl = 'https://kdourl.com/api/links';
function kondaino_api(string $method, string $url, string $token, ?array $body = null): array
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$headers = ["Authorization: Bearer $token"];
if ($body !== null) {
$headers[] = 'Content-Type: application/json';
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
// Create a short link
$created = kondaino_api('POST', $apiUrl, $token, [
'long_url' => 'https://example.com/some/long/path',
]);
echo $created['data']['short_url'], "\n";
// List your links
$list = kondaino_api('GET', $apiUrl, $token);
foreach ($list['data'] as $link) {
echo "{$link['short_url']} -> {$link['long_url']} ({$link['clicks']} clicks)\n";
}
Don't have a paid account yet? Email us to upgrade and we'll turn on API access — no demo, no sales call.
Create your free account to get started.