Kendi uygulamandan link kısalt, güncelle, istatistik çek. Güvenli anahtar + kapsam sistemi, tutarlı JSON, hız-limit başlıkları.
https://vvvv.tr/api/v1
Tüm uç noktalar bu adrese görecelidir. İstek ve yanıt gövdeleri JSON'dır (UTF-8).
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"
Her anahtar yalnızca sahip olduğu kapsamdaki işlemleri yapabilir. Eksik kapsamda 403 insufficient_scope döner.
| Kapsam | İzin |
|---|---|
read | Okuma: link/bio/hesap listeleme ve istatistik |
write | Yazma: link kısaltma ve güncelleme |
delete | Silme: link silme |
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).
403 ip_not_allowed alır.X-Request-Id başlığı ve hata gövdesinde request_id bulunur — destek taleplerinde paylaşın.Content-Type: application/json (veya form) zorunludur; diğerleri 415 alır. Gövde en fazla 256 KB.Tüm yanıtlar tutarlı bir zarf kullanır:
# Başarılı
{ "ok": true, "data": { ... }, "meta": { ... } }
# Hatalı
{ "ok": false, "error": { "type": "validation", "message": "..." } }
| Yöntem | Yol | Kapsam | Açı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). |
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"
} }
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 }, ... ]
} }
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" }'
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"] }'
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)"] } }
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).
curl "https://vvvv.tr/api/v1/analytics?days=30" \ -H "Authorization: Bearer API_ANAHTARINIZ"
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.
| HTTP | type | Anlamı |
|---|---|---|
| 400 | invalid_json | Gövde geçersiz JSON |
| 401 | unauthorized | Geçersiz/eksik/süresi dolmuş anahtar |
| 403 | forbidden_plan | Paket API erişimine izin vermiyor |
| 403 | insufficient_scope | Anahtarın kapsamı yetersiz |
| 403 | ip_not_allowed | Anahtar bu IP'den kullanılamaz (izin listesi) |
| 403 | limit_reached | Paket limiti doldu (ör. dinamik QR) |
| 404 | not_found | Kaynak/uç nokta yok |
| 405 | method_not_allowed | Yöntem desteklenmiyor |
| 409 | status_locked | Engelli/incelemedeki linkin durumu değiştirilemez |
| 413 | payload_too_large | Gövde 256 KB sınırını aşıyor |
| 415 | unsupported_media_type | Desteklenmeyen Content-Type |
| 422 | validation | Geçersiz istek verisi |
| 423 | blocked | Link güvenlik taramasını geçemedi |
| 429 | quota_exceeded / rate_limited | Kota veya hız limiti aşıldı |