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.

FeatureFreePaid — $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.