REST API · v1

Geliştirici Dokümantasyonu

Kendi uygulamandan link kısalt, güncelle, istatistik çek. Güvenli anahtar + kapsam sistemi, tutarlı JSON, hız-limit başlıkları.

Temel Adres (Base URL)

https://vvvv.tr/api/v1

Tüm uç noktalar bu adrese görecelidir. İstek ve yanıt gövdeleri JSON'dır (UTF-8).

Kimlik Doğrulama

Panel → API bölümünden bir anahtar oluşturun. Anahtar yalnızca bir kez gösterilir. Her isteğe iki yöntemden biriyle ekleyin:

# Önerilen — Bearer token
curl "https://vvvv.tr/api/v1/account" \
  -H "Authorization: Bearer API_ANAHTARINIZ"

# Alternatif — özel başlık
curl "https://vvvv.tr/api/v1/account" \
  -H "X-Api-Key: API_ANAHTARINIZ"
Güvenlik: Anahtar yalnızca başlıkta taşınır; URL veya gövdede anahtar kabul edilmez. Her uygulamaya ayrı ve yalnızca gerekli kapsamda anahtar verin. Anahtarları herkese açık depolara koymayın.

Kapsamlar (Scopes)

Her anahtar yalnızca sahip olduğu kapsamdaki işlemleri yapabilir. Eksik kapsamda 403 insufficient_scope döner.

Kapsamİzin
readOkuma: link/bio/hesap listeleme ve istatistik
writeYazma: link kısaltma ve güncelleme
deleteSilme: link silme

Hız Limitleri & Kota

Günlük istek kotanız paketinize göredir. Her yanıtta güncel durum başlıklarda döner:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 996
X-RateLimit-Reset: 1787011200   # kotanın sıfırlanacağı Unix zamanı

Kota dolunca 429 quota_exceeded, IP taban limiti veya anahtarın dakikalık sınırı (varsayılan 120/dk) aşılınca 429 rate_limited döner (Retry-After başlığıyla).

Anahtar Güvenliği

Yanıt Biçimi

Tüm yanıtlar tutarlı bir zarf kullanır:

# Başarılı
{ "ok": true, "data": { ... }, "meta": { ... } }

# Hatalı
{ "ok": false, "error": { "type": "validation", "message": "..." } }

Uç Nokta Referansı

YöntemYolKapsamAçıklama
GET /ping read? Servis sağlık kontrolü (kimlik gerektirmez).
GET / — API keşif/özet bilgisi (kimlik gerektirmez).
GET /account read Hesap, paket ve kota bilgisi.
GET /account/usage read Etkin limitler + kullanım (müşteriye özel limitler dahil).
GET /account/webhook read Otomasyon webhook adresini ve olaylarını getir.
PUT /account/webhook write Webhook adresini ayarla (yalnızca güvenli https).
GET /account/keys read Kendi API anahtarlarını listele (yalnızca ipuçları).
GET /links read Linkleri listele. ?page, ?per_page (max 100), ?q, ?status
POST /shorten write Tek link kısalt (title, tags, interstitial, interstitial_theme, utm, expires_at...).
POST /links/bulk write Toplu link kısalt (max 50 URL).
GET /tags read Etiketleri sayılarıyla listele.
GET /analytics read Hesap geneli özet: toplam tık, en iyi linkler, günlük seri. ?days
POST /scan read VVVV Zeka ile URL güvenlik analizi (link oluşturmaz).
GET /link/{code} read Tek link detayı + tekil ziyaretçi.
PATCH /link/{code} write Link güncelle (title, status, url, tags, interstitial, interstitial_theme, max_clicks, expires_at, folder_id).
DELETE /link/{code} delete Linki ve istatistiklerini sil.
GET /link/{code}/stats read Zaman serisi + ülke/cihaz/kaynak kırılımı. ?days (max 90)
GET /link/{code}/qr read Link için QR PNG adresi. ?size
GET /folders read Link klasörlerini listele (link sayılarıyla).
POST /folders write Yeni klasör oluştur (name, color).
DELETE /folder/{id} delete Klasörü sil (linkler klasörsüz kalır).
GET /bios read Biyografi sayfalarını listele.
GET /bio/{slug} read Bio sayfası detayı + blokları.
GET /qrs read Dinamik QR kodlarınız (sayfalı) + limit bilgisi.
POST /qrs write Yeni dinamik QR: sabit /q/{kod} adresi, düzenlenebilir hedef.
GET /qr/{code} read QR detayı (hedef, durum, tarama, tasarım).
PATCH /qr/{code} write Hedef/başlık/tasarım/aktiflik güncelle — kod değişmez.
DELETE /qr/{code} delete QR kodu ve istatistiklerini sil.
GET /qr/{code}/stats read Günlük tarama serisi + mobil/masaüstü kırılımı.
GET /qr/{code}/image read QR görseli (SVG/PNG, birebir renkler).

POST /shorten — Link kısalt

curl -X POST "https://vvvv.tr/api/v1/shorten" \
  -H "Authorization: Bearer API_ANAHTARINIZ" \
  -H "Content-Type: application/json" \
  -d '{
        "url": "https://ornek.com/cok/uzun/link",
        "alias": "kampanya",          // opsiyonel (Pro)
        "title": "Yaz kampanyası",     // opsiyonel
        "expires_at": "2026-12-31",    // opsiyonel (Pro)
        "max_clicks": 1000,            // opsiyonel (Pro)
        "tags": "kampanya,instagram"   // opsiyonel
      }'

Yanıt (201):

{ "ok": true, "data": {
    "code": "kampanya",
    "short_url": "https://vvvv.tr/kampanya",
    "url": "https://ornek.com/cok/uzun/link",
    "status": "active", "clicks": 0,
    "scan_status": "safe", "created_at": "2026-01-01 12:00:00"
} }

GET /link/{code}/stats — Detaylı istatistik

curl "https://vvvv.tr/api/v1/link/kampanya/stats?days=30" \
  -H "Authorization: Bearer API_ANAHTARINIZ"
{ "ok": true, "data": {
    "clicks": 1240, "unique_visitors": 980,
    "daily":       [ { "day": "2026-01-01", "clicks": 42, "uniques": 30 }, ... ],
    "by_country":  [ { "country": "TR", "n": 900 }, ... ],
    "by_device":   [ { "device": "Mobil", "n": 700 }, ... ],
    "by_referrer": [ { "host": "instagram.com", "n": 300 }, ... ]
} }

PATCH /link/{code} — Güncelle

curl -X PATCH "https://vvvv.tr/api/v1/link/kampanya" \
  -H "Authorization: Bearer API_ANAHTARINIZ" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Yeni başlık", "status": "paused" }'

POST /links/bulk — Toplu

curl -X POST "https://vvvv.tr/api/v1/links/bulk" \
  -H "Authorization: Bearer API_ANAHTARINIZ" \
  -H "Content-Type: application/json" \
  -d '{ "urls": ["https://a.com", "https://b.com"] }'

POST /scan — VVVV Zeka güvenlik analizi

Bir URL'yi link oluşturmadan, yerleşik akıllı motorla analiz eder. 0-100 risk skoru, karar (safe/review/malicious) ve gerekçeleri döndürür.

curl -X POST "https://vvvv.tr/api/v1/scan" \
  -H "Authorization: Bearer API_ANAHTARINIZ" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://ornek.com/sayfa" }'

# Yanıt
{ "ok": true, "data": {
    "verdict": "review", "score": 47, "risk": "medium",
    "reasons": ["Riskli TLD", "Rastgele görünen alan adı (yüksek entropi)"] } }

POST /qrs — Dinamik QR oluştur

Basılı QR kodu her zaman aynı aracı adresi (/q/{kod}) taşır; hedefi istediğiniz zaman PATCH /qr/{code} ile değiştirirsiniz. Her hedef değişikliği güvenlik taramasından geçer.

curl -X POST "https://vvvv.tr/api/v1/qrs" \
  -H "Authorization: Bearer API_ANAHTARINIZ" \
  -H "Content-Type: application/json" \
  -d '{ "target_url": "https://ornek.com/menu", "title": "Masa QR",
        "style": { "fg": "#7c3aed", "fg2": "#ec4899", "grad": "linear",
                   "module": "dots", "eyestyle": "circle", "ecl": "Q" } }'

# Hedefi değiştir (kod ve basılı QR aynı kalır)
curl -X PATCH "https://vvvv.tr/api/v1/qr/AbC12xY" \
  -H "Authorization: Bearer API_ANAHTARINIZ" \
  -H "Content-Type: application/json" \
  -d '{ "target_url": "https://ornek.com/yeni-menu" }'

# Görsel (SVG veya PNG; size 128-2048)
curl "https://vvvv.tr/api/v1/qr/AbC12xY/image?format=png&size=1024" \
  -H "Authorization: Bearer API_ANAHTARINIZ" -o qr.png

Stil alanları: fg, fg2, bg, eye (#rrggbb), grad (none/linear/radial), module (square/rounded/dots/diamond), eyestyle (square/rounded/circle), ecl (L/M/Q/H), margin (0-8), transparent (true/false).

GET /analytics — Hesap özeti

curl "https://vvvv.tr/api/v1/analytics?days=30" \
  -H "Authorization: Bearer API_ANAHTARINIZ"

JavaScript (fetch) Örneği

const res = await fetch("https://vvvv.tr/api/v1/shorten", {
  method: "POST",
  headers: {
    "Authorization": "Bearer API_ANAHTARINIZ",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({ url: "https://ornek.com/uzun-link" })
});
const { ok, data, error } = await res.json();
if (ok) console.log(data.short_url); else console.error(error.message);

API, CORS destekler (Access-Control-Allow-Origin: *). Anahtarınızı tarayıcı tarafı koda gömmeyin; sunucu tarafında kullanın.

Hata Kodları

HTTPtypeAnlamı
400invalid_jsonGövde geçersiz JSON
401unauthorizedGeçersiz/eksik/süresi dolmuş anahtar
403forbidden_planPaket API erişimine izin vermiyor
403insufficient_scopeAnahtarın kapsamı yetersiz
403ip_not_allowedAnahtar bu IP'den kullanılamaz (izin listesi)
403limit_reachedPaket limiti doldu (ör. dinamik QR)
404not_foundKaynak/uç nokta yok
405method_not_allowedYöntem desteklenmiyor
409status_lockedEngelli/incelemedeki linkin durumu değiştirilemez
413payload_too_largeGövde 256 KB sınırını aşıyor
415unsupported_media_typeDesteklenmeyen Content-Type
422validationGeçersiz istek verisi
423blockedLink güvenlik taramasını geçemedi
429quota_exceeded / rate_limitedKota veya hız limiti aşıldı

API Anahtarı Oluştur