Documentazione API

Tutte le API rispondono in JSON UTF-8. Autenticazione via X-API-Key oppure Authorization: Bearer <api_key>.

Base URL: https://tapy.cc

POST /api/v1/shorten

Crea uno short link per il proprietario della API key.

Body JSON

{"url":"https://example.com","title":"Landing","campaign":"spring-2026","custom_code":"promo26"}

Regola piano: su piano Free il campo custom_code viene ignorato e il sistema genera automaticamente uno short code casuale.

Risposta 201

{"short_code":"Ab3xK9q","short_url":"https://tapy.cc/Ab3xK9q","destination_url":"https://example.com"}

GET /api/v1/links

Ritorna tutti i link creati dall'utente della API key.

Risposta 200

{"data":[{"short_code":"abc123","destination_url":"https://example.com","campaign":"spring-2026","clicks":10}]}

GET /api/v1/stats/{code}

Recupera statistiche e metadata di un singolo link.

Risposta 200

{"data":{"short_code":"abc123","destination_url":"https://example.com","campaign":"spring-2026","clicks":10,"is_active":1}}

Errori standard

  • 401 API key mancante o non valida
  • 404 Link non trovato
  • 409 Short code già in uso / limite piano raggiunto
  • 422 URL non valido

cURL rapido

curl -X POST "https://tapy.cc/api/v1/shorten" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d "{\"url\":\"https://example.com\",\"campaign\":\"spring-2026\"}"

PHP smoke example

Esempio completo in stile smoke-test (inserisci la tua API key nel placeholder).

<?php

declare(strict_types=1);

$baseUrl = 'https://tapy.cc';
$apiKey = 'YOUR_API_KEY'; // replace with your key

function request_json(string $method, string $url, string $apiKey, ?array $payload = null): array
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);

    $headers = [
        'Accept: application/json',
        'X-API-Key: ' . $apiKey,
    ];

    if ($payload !== null) {
        $headers[] = 'Content-Type: application/json';
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload, JSON_UNESCAPED_SLASHES));
    }

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $raw = curl_exec($ch);
    $status = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);

    return [$status, json_decode((string) $raw, true) ?: ['raw' => $raw]];
}

[$createStatus, $createBody] = request_json('POST', $baseUrl . '/api/v1/shorten', $apiKey, [
    'url' => 'https://example.com',
    'title' => 'Landing',
    'campaign' => 'spring-2026',
]);

echo "POST /api/v1/shorten => HTTP {$createStatus}\n";
print_r($createBody);

if (!isset($createBody['short_code'])) {
    exit(1);
}

$code = (string) $createBody['short_code'];

[$statsStatus, $statsBody] = request_json('GET', $baseUrl . '/api/v1/stats/' . rawurlencode($code), $apiKey);
echo "GET /api/v1/stats/{$code} => HTTP {$statsStatus}\n";
print_r($statsBody);

[$linksStatus, $linksBody] = request_json('GET', $baseUrl . '/api/v1/links', $apiKey);
echo "GET /api/v1/links => HTTP {$linksStatus}\n";
print_r($linksBody);

Output atteso

Esempio indicativo di output CLI quando la sequenza API va a buon fine.

POST /api/v1/shorten => HTTP 201
Array
(
    [short_code] => Ab3xK9q
    [short_url] => https://tapy.cc/Ab3xK9q
    [destination_url] => https://example.com
)

GET /api/v1/stats/Ab3xK9q => HTTP 200
Array
(
    [data] => Array
        (
            [short_code] => Ab3xK9q
            [destination_url] => https://example.com
            [campaign] => spring-2026
            [clicks] => 0
            [is_active] => 1
        )
)

GET /api/v1/links => HTTP 200
Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [short_code] => Ab3xK9q
                    [destination_url] => https://example.com
                    [campaign] => spring-2026
                    [clicks] => 0
                )
        )
)