API başvurusu

REST API
Bağlantılarınızın üzerine inşa edin.

Bir API tokenıyla kimlik doğrulaması yapın, bağlantıları listeleyin ve oluşturun, ziyaretleri okuyun ve webhook'lara abone olun.

Temel URL https://letl.ink/api/v1 Yalnızca HTTPS

Planlar Growth Ultimate
Bu sayfada

Başlarken

REST API Growth ve Ultimate planlarında kullanılabilir. İstekler HTTPS üzerinden https://letl.ink/api/v1 adresine gider. Free veya Solo'daki bir çalışma alanı /api/v1 üzerinden 403 plan_required alır; MCP uç noktası ayrıca Ultimate ile sınırlıdır.

  1. Entegrasyonlar → REST API'yi açın (yalnızca çalışma alanı sahipleri ve yöneticileri).
  2. Bir token oluşturun. Süresi dolmaz.
  3. Bunu bir şifre gibi saklayın. Tek bir token REST API'ye, MCP sunucusuna ve bu çalışma alanına bağlı tüm otomasyon platformlarına hizmet eder; bu nedenle yeniden oluşturmak hepsini aynı anda geçersiz kılar.

Üyeler, oluşturulmuşsa mevcut bir tokenı kopyalayabilir; yalnızca sahipler ve yöneticiler yenileyebilir.

Kimlik doğrulama

Token'ı X-API-KEY veya Authorization: Bearer olarak gönderin. Her ikisi de /api/v1 ve /mcp üzerinde kabul edilir. Hiç token içermeyen bir istek 401 unauthenticated döndürür.

GET Ben kimim?
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/auth/me

Eşdeğer başlık: Authorization: Bearer YOUR_TOKEN

Kurallar

Bunlar aşağıdaki tüm uç noktalar için geçerlidir.

Yanıt zarfı

Her başarılı yanıt, data anahtarı ve sonuç hakkında söylenecek bir şey olduğunda — sayfalama, belirlenen tarih aralığı, coğrafyanın dahil edilip edilmediği — meta anahtarı içeren bir JSON nesnesidir. Her hata, sabit bir code, insan tarafından okunabilir bir message ve bazen details içeren error anahtarlı bir nesnedir. Mesaj metnine göre değil, her zaman code değerine göre dallanın.

Şekiller
// success
{ "data": { … }, "meta": { … } }

// failure
{ "error": { "code": "invalid_parameter",
             "message": "sort must be one of: created_at, clicks.",
             "details": { "parameter": "sort" } } }

Sayfalama

Liste uç noktaları limit (1–200, varsayılan 50) ve offset kabul eder. meta bloğu total, has_more ve next_offset değerlerini bildirir; böylece hesap yapmadan sayfalayabilirsiniz: has_more değeri false olana kadar offset = meta.next_offset ile çağırmaya devam edin.

Tüm bağlantılarda sayfalama
offset=0
while [ "$offset" != "null" ]; do
  page=$(curl -s -H "X-API-KEY: $TOKEN" \
    "https://letl.ink/api/v1/links?limit=200&offset=$offset")
  echo "$page" | jq -c '.data[]'
  offset=$(echo "$page" | jq -r '.meta.next_offset')
done

Sıralama, filtreleme ve arama

GET /links; sort (created_at, clicks, short_code, title, updated_at), direction (asc/desc), search (kısa kod, başlık ve hedefle eşleşir), type, archived, favorite ve domain parametrelerini kabul eder. Bilinmeyen değerler sessizce yok sayılmak yerine invalid_parameter ve izin verilen değerlerin listesiyle reddedilir.

Tarih aralıkları

start_date ve end_date YYYY-MM-DD biçimini kullanır ve her iki günü de kapsar. Aralık, planınızın saklama sınırına göre kırpılır — 30 günlük saklama süresine sahip bir plandan bir yıllık geçmiş istemek, mevcut 30 günü döndürür; meta.date_range gerçekte kullanılan aralığı bildirir.

Hız sınırları

Hesap başına dakikada 600 istek, kayan pencereyle. Her yanıt X-RateLimit-Limit, X-RateLimit-Remaining ve X-RateLimit-Reset (Unix zaman damgası) başlıklarını taşır. Sınırı aşmak, saniye cinsinden Retry-After başlığıyla birlikte 429 rate_limited döndürür. Hemen yeniden denemek yerine Retry-After süresi kadar bekleyin.

Her yanıttaki başlıklar
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 586
X-RateLimit-Reset: 1789000816

Sürümleme

Sürüm yolda yer alır. Bir yanıta alan veya yeni bir isteğe bağlı parametre eklemek geriye dönük uyumluluğu bozmaz ve her an olabilir; bu nedenle yanıtları savunmacı biçimde ayrıştırın ve tanımadığınız anahtarları yok sayın. Mevcut bir alanı değiştirecek veya kaldıracak her şey yeni bir sürüm önekiyle yayınlanır.

Uç noktalar

Hesap

GET /me Bağlantı testi

Kimlik, çalışma alanı, plan ve o planın sağladığı tüm haklar. Bir tokenı doğrulamanın ve hesabın neye izinli olduğunu denemeden önce öğrenmenin en ucuz yolu.

GET cURL
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/me
Yanıt 200
{
  "data": {
    "user": { "id": 1, "email": "[email protected]", "name": "You" },
    "workspace": { "id": 12, "name": "My Workspace", "block_bots": true },
    "plan": {
      "id": "growth",
      "name": "Growth",
      "limits": {
        "links": 200,
        "monthly_clicks": 100000,
        "custom_domains": 3,
        "qr_codes": 30,
        "retention_days": 365
      },
      "features": {
        "api": true,
        "webhooks": true,
        "integrations": true,
        "ai_access": false,
        "geo_analytics": false,
        "smart_link_types": true
      }
    },
    "base_domain": "letl.ink"
  }
}
GET /usage

Bu fatura ayında her kotanın ne kadarının kullanıldığı. Bir müşteriyi izlenen tıklama sınırına ulaşmadan önce uyarmak için kullanın — sınır aşıldığında yönlendirme yine çalışır, ancak tıklamalar kaydedilmez.

Yanıt 200
{
  "data": {
    "links": { "used": 42, "limit": 200, "remaining": 158, "percent_used": 21.0 },
    "clicks_this_month": { "used": 8140, "limit": 100000, "remaining": 91860, "percent_used": 8.1 },
    "custom_domains": { "used": 1, "limit": 3, "remaining": 2, "percent_used": 33.3 },
    "qr_codes": { "used": 4, "limit": 30, "remaining": 26, "percent_used": 13.3 }
  },
  "meta": { "plan": "growth", "period": "2026-09" }
}
GET /domains

Çalışma alanındaki özel alan adları ve her birinin DNS doğrulamasını tamamlayıp tamamlamadığı. Bağlantı oluştururken domain alanında yalnızca doğrulanmış alan adları kullanılabilir.

GET /integrations

Ürünün sunduğu her entegrasyon; planınızın onu içerip içermediği, bu çalışma alanının onu bağlayıp bağlamadığı ve teslimatın nasıl gittiği — son durum, son hata ve art arda başarısızlık sayısı. Çok sayıda çalışma alanını izlemek için kullanışlıdır.

Bağlantılar

Analitik

GET /analytics/summary

Tüm çalışma alanı için temel sayılar: tüm zamanlardaki ve seçilen aralıktaki tıklamalar, tekil ziyaretçiler, QR taramaları, en yoğun gün ve günün saatine ve haftanın gününe göre dağılımlar. days parametresini kabul eder (varsayılan 30, saklama sürenizle sınırlıdır).

Yanıt 200 (kısaltılmış)
{
  "data": {
    "window_days": 30,
    "clicks": {
      "total": 24592, "window": 8140, "last_7_days": 2103,
      "daily_average": 271,
      "peak_day": { "date": "Sep 02", "clicks": 612 }
    },
    "visitors": { "unique_total": 18204, "unique_window": 6021 },
    "qr": { "scans_total": 940, "scans_window": 310 },
    "timing": {
      "by_hour": [12, 4, 2, …],
      "by_weekday": [1420, 1610, 1585, 1490, 1310, 480, 245],
      "peak_hour": { "peakHour": 14, "peakValue": 812, "label": "14:00–14:59" },
      "peak_weekday": { "peakDay": 1, "peakValue": 1610, "label": "Tuesday" }
    },
    "links": { "active": 42, "limit": 200 }
  },
  "meta": { "plan": "growth", "geo_included": true, "retention_days": 365 }
}
GET /analytics/timeseries

Grafiğe hazır günlük tıklama sayıları. Tek bir bağlantıyla sınırlamak için link_id, aralığı belirlemek için days gönderin. Trafik olmayan günler atlanmak yerine sıfır olarak döndürülür; böylece seri her zaman kesintisizdir.

Yanıt 200
{
  "data": [
    { "date": "Sep 04", "clicks": 22 },
    { "date": "Sep 05", "clicks": 11 }
  ],
  "meta": { "window_days": 7, "total": 33, "link_id": null }
}
GET /analytics/breakdown

Tek bir boyuta göre gruplanmış tıklamalar ve her satırın toplamdaki payı.

Sorgu parametreleri

  • dimension string

    channel, referrer, device, browser, os, brand, variation veya country. browser, os, brand ve variation için link_id gerekir.

    Gerekli
  • link_id integer

    Tek bir bağlantıyla sınırlayın. Tüm çalışma alanı için boş bırakın.

    İsteğe bağlı
  • limit integer

    1–100. Varsayılan 10.

    İsteğe bağlı
Yanıt 200
{
  "data": [
    { "label": "Search", "value": 215, "share": 33.1 },
    { "label": "Social", "value": 201, "share": 30.9 },
    { "label": "Direct / none", "value": 142, "share": 21.8 }
  ],
  "meta": { "dimension": "channel", "link_id": 49, "total": 650 }
}
GET /events Sayfalı

Çalışma alanındaki tüm bağlantıların ham ziyaret akışı, en yeniden eskiye. Bu, GET /visits uç noktasının modern karşılığıdır: aynı veriler, standart zarf, limit ve offset desteği.

Yanıt 200
{
  "data": [
    {
      "id": 2691,
      "link_id": 49,
      "short_code": "spring",
      "occurred_at": "2026-09-10T22:45:33+00:00",
      "ip_address": "203.0.113.7",
      "referrer": "https://twitter.com/",
      "browser": "Chrome",
      "os": "iOS",
      "device_type": "mobile",
      "device_brand": "Apple",
      "country": "US",
      "variation": "control"
    }
  ],
  "meta": { "limit": 50, "returned": 50, "geo_included": true }
}

Webhook'lar

GET /hooks

Bu hesapta kayıtlı webhook uç noktaları.

POST /hooks

Kaydedilen her tıklamada bir JSON yükü almak için bir HTTPS uç noktası kaydedin. Hesap başına en fazla 25. Başarısız teslimatlar otomatik olarak yeniden denenir.

JSON gövdesi

  • target_url

    https:// olmalıdır.

    Gerekli
  • event

    Varsayılan link_visited; şu anda tek olay budur.

    İsteğe bağlı
POST cURL
curl -X POST https://letl.ink/api/v1/hooks \
  -H "X-API-KEY: YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"target_url": "https://example.com/hooks/clicks"}'
DELETE /hooks/{id}

Bir webhook uç noktasını kaldırın. POST /hooks/subscribe ve DELETE /hooks/unsubscribe/{id}, Zapier'in REST Hook akışı için kullanılabilir olmaya devam eder.

Eski

GET /auth/me Eski

Orijinal bağlantı testi: kullanıcı kimliğinizi, e-postanızı ve çalışma alanı kimliğinizi/adınızı düz bir nesne olarak döndürür. GET /me aynı kimliği plan sınırlarınız ve özellik işaretlerinizle birlikte döndürür ve yeni kodlar için daha iyi bir seçimdir.

GET cURL
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/auth/me
Yanıt 200
{
  "id": 1,
  "email": "[email protected]",
  "workspace_id": 12,
  "workspace_name": "My Workspace"
}
GET /visits Eski

Çalışma alanındaki en son 50 ziyaret, yalın bir JSON dizisi olarak — zarf olmadan — visit_id, visit_time, link_shortcode ve visitor_* alan adlarıyla. Zapier'in REST Hook "perform list" adımı bunu okur; bu nedenle yapısı sabittir. Yeni geliştirmeler için GET /events kullanın.

POST /hooks/subscribe Zapier

REST Hook aboneliği. target_url ve isteğe bağlı bir event (varsayılan link_visited) alır ve oluşturulan aboneliği zarf olmadan, düz biçimde döndürür. POST /hooks standart biçimdeki aynı işlemdir.

DELETE /hooks/unsubscribe/{id} Zapier

REST Hook abonelikten çıkma; {"success": true} döndürür. DELETE /hooks/{id} standart biçimdeki karşılığıdır.

Hatalar

  • 400 invalid_request

    Gövde bir JSON nesnesi değildi veya zorunlu bir alan eksikti.

  • 400 invalid_parameter

    Bir sorgu parametresi hatalı biçimde veya izin verilen kümenin dışında. details.parameter sorunlu parametreyi belirtir.

  • 401 unauthenticated

    Token gönderilmedi. X-API-KEY veya Authorization: Bearer ekleyin.

  • 401 invalid_token

    Token hiçbir hesapla eşleşmiyor. Yeniden oluşturulmuş olabilir.

  • 403 plan_required

    Hesabın planı bu uç noktayı veya özelliği içermiyor. details.upgrade_url faturalandırma sayfasını gösterir.

  • 403 forbidden

    Kimlik doğrulandı ancak izin yok — örneğin bir üyenin yalnızca sahibe özel bir işlemi denemesi.

  • 404 not_found

    Bu çalışma alanında böyle bir kaynak yok. Başka bir çalışma alanına ait kimlikler yasak yerine bulunamadı olarak bildirilir.

  • 409 conflict

    İstek mevcut durumla çakışıyor — webhook sınırına ulaşıldı veya hesabın henüz bir çalışma alanı yok.

  • 422

    Toplu işteki tüm satırlar başarısız olduğunda POST /links/bulk tarafından döndürülür. meta.errors alanını inceleyin.

  • 429 rate_limited

    Son bir dakikada 600'den fazla istek. Retry-After saniye kadar bekleyin.

Eski GET /visits ve GET /links/{id}/visits uç noktaları kendi alan adlarıyla yalın bir JSON dizisi döndürür ve bunlar üzerine kurulmuş Zapier entegrasyonları için sabitlenmiştir. Yeni kodlar, standart zarfı kullanan ve sayfalamayı destekleyen GET /events ve GET /links/{id}/events uç noktalarını kullanmalıdır.

Başka sorunuz mu var?

Yardım etmek için buradayız. Bize ulaşın, en kısa sürede size dönüş yapalım.