API संदर्भ

REST API
अपने लिंक पर कुछ भी बनाएँ।

API टोकन से ऑथेंटिकेट करें, लिंक की सूची देखें और बनाएँ, विज़िट पढ़ें, और वेबहुक सब्सक्राइब करें।

बेस URL https://letl.ink/api/v1 केवल HTTPS

प्लान Growth Ultimate
इस पेज पर

शुरुआत करें

REST API Growth और Ultimate पर उपलब्ध है। रिक्वेस्ट HTTPS पर https://letl.ink/api/v1 को भेजी जाती हैं। Free या Solo वाले वर्कस्पेस को /api/v1 से 403 plan_required मिलता है; MCP एंडपॉइंट अलग से Ultimate तक सीमित है।

  1. इंटीग्रेशन → REST API खोलें (केवल वर्कस्पेस के मालिक और एडमिन)।
  2. एक टोकन बनाएँ। यह एक्सपायर नहीं होता।
  3. इसे पासवर्ड की तरह सुरक्षित रखें। एक ही टोकन REST API, MCP सर्वर और इस वर्कस्पेस से जुड़े हर ऑटोमेशन प्लेटफ़ॉर्म के लिए काम करता है, इसलिए इसे दोबारा बनाने से ये सभी एक साथ अमान्य हो जाते हैं।

अगर टोकन बनाया जा चुका है तो सदस्य उसे कॉपी कर सकते हैं; केवल मालिक और एडमिन उसे बदल सकते हैं।

ऑथेंटिकेशन

टोकन X-API-KEY के रूप में या Authorization: Bearer के रूप में भेजें। /api/v1 और /mcp दोनों पर दोनों स्वीकार किए जाते हैं। बिना किसी टोकन वाला अनुरोध 401 unauthenticated लौटाता है।

GET मैं कौन हूँ?
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/auth/me

समान हेडर: Authorization: Bearer YOUR_TOKEN

परंपराएँ

ये नीचे के हर एंडपॉइंट पर लागू होते हैं।

रिस्पॉन्स का ढाँचा

हर सफल रिस्पॉन्स एक JSON ऑब्जेक्ट होता है जिसमें data कुंजी होती है, और meta कुंजी तब जब नतीजे के बारे में कुछ बताना हो — पेजिनेशन, तय की गई तिथि अवधि, भूगोल शामिल था या नहीं। हर विफलता एक ऑब्जेक्ट होती है जिसमें error कुंजी होती है, जिसमें एक स्थिर code, एक पढ़ने योग्य message, और कभी-कभी details होते हैं। code के आधार पर ब्रांच करें, संदेश के टेक्स्ट पर कभी नहीं।

आकार
// success
{ "data": { … }, "meta": { … } }

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

पेजिनेशन

सूची वाले एंडपॉइंट limit (1–200, डिफ़ॉल्ट 50) और offset स्वीकार करते हैं। meta ब्लॉक total, has_more और next_offset बताता है, ताकि आप बिना हिसाब लगाए पेज बदल सकें: offset = meta.next_offset के साथ तब तक कॉल करते रहें जब तक has_more false न हो जाए।

हर लिंक के पेज पलटना
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

सॉर्टिंग, फ़िल्टरिंग और सर्च

GET /links ये पैरामीटर स्वीकार करता है: sort (created_at, clicks, short_code, title, updated_at), direction (asc/desc), search (शॉर्ट कोड, टाइटल और डेस्टिनेशन से मिलान करता है), type, archived, favorite और domain। अज्ञात मानों को चुपचाप अनदेखा करने के बजाय invalid_parameter के साथ अस्वीकार किया जाता है और अनुमत मानों की सूची दी जाती है।

तिथि अवधि

start_date और end_date YYYY-MM-DD फ़ॉर्मैट में होते हैं और दोनों दिन शामिल होते हैं। अवधि को आपके प्लान की रिटेंशन सीमा तक सीमित किया जाता है — 30-दिन रिटेंशन वाले प्लान से एक साल का इतिहास माँगने पर उसके पास मौजूद 30 दिन मिलते हैं, और meta.date_range बताता है कि असल में कौन-सी अवधि इस्तेमाल हुई।

रेट लिमिट

हर अकाउंट के लिए प्रति मिनट 600 अनुरोध, स्लाइडिंग विंडो पर। हर रिस्पॉन्स में X-RateLimit-Limit, X-RateLimit-Remaining और X-RateLimit-Reset (एक Unix टाइमस्टैम्प) होते हैं। सीमा पार करने पर 429 rate_limited लौटता है, साथ में सेकंड में Retry-After हेडर। तुरंत दोबारा कोशिश करने के बजाय Retry-After के अनुसार रुकें।

हर रिस्पॉन्स पर हेडर
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 586
X-RateLimit-Reset: 1789000816

वर्ज़निंग

पाथ में वर्ज़न होता है। रिस्पॉन्स में कोई फ़ील्ड या नया वैकल्पिक पैरामीटर जोड़ना ब्रेकिंग बदलाव नहीं है और कभी भी हो सकता है, इसलिए सावधानी से पार्स करें और अनजान कुंजियों को अनदेखा करें। किसी मौजूदा फ़ील्ड को बदलने या हटाने वाला कोई भी बदलाव नए वर्ज़न प्रीफ़िक्स के तहत आता है।

एंडपॉइंट

अकाउंट

GET /me कनेक्शन टेस्ट

पहचान, वर्कस्पेस, प्लान और उस प्लान की हर पात्रता। टोकन की पुष्टि करने और कोशिश करने से पहले यह जानने का सबसे आसान तरीका कि अकाउंट को क्या करने की अनुमति है।

GET cURL
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/me
रिस्पॉन्स 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

इस बिलिंग माह में हर सीमा का कितना हिस्सा इस्तेमाल हुआ। ग्राहक को ट्रैक-क्लिक सीमा तक पहुँचने से पहले चेतावनी देने के लिए इसका उपयोग करें — उसके बाद रीडायरेक्ट फिर भी काम करता है, लेकिन क्लिक दर्ज होना बंद हो जाते हैं।

रिस्पॉन्स 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

वर्कस्पेस के कस्टम डोमेन और यह कि हर एक का DNS सत्यापन पूरा हुआ या नहीं। लिंक बनाते समय domain फ़ील्ड में केवल सत्यापित डोमेन इस्तेमाल किए जा सकते हैं।

GET /integrations

प्रोडक्ट का हर इंटीग्रेशन, आपके प्लान में वह शामिल है या नहीं, इस वर्कस्पेस ने उसे कनेक्ट किया है या नहीं, और डिलीवरी कैसी चल रही है — आखिरी स्थिति, आखिरी त्रुटि और लगातार विफलताओं की गिनती। कई वर्कस्पेस की निगरानी के लिए उपयोगी।

लिंक

एनालिटिक्स

GET /analytics/summary

पूरे वर्कस्पेस के मुख्य आँकड़े: अब तक के और चुनी गई अवधि के क्लिक, यूनीक विज़िटर, QR स्कैन, सबसे व्यस्त दिन, और घंटे व हफ़्ते के दिन के हिसाब से वितरण। days स्वीकार करता है (डिफ़ॉल्ट 30, आपके रिटेंशन तक सीमित)।

रिस्पॉन्स 200 (संक्षिप्त)
{
  "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

दैनिक क्लिक गिनती, चार्ट के लिए तैयार। इसे एक लिंक तक सीमित करने के लिए link_id दें, और अवधि तय करने के लिए days। बिना ट्रैफ़िक वाले दिन छोड़े नहीं जाते बल्कि शून्य के रूप में लौटाए जाते हैं, ताकि सीरीज़ हमेशा लगातार रहे।

रिस्पॉन्स 200
{
  "data": [
    { "date": "Sep 04", "clicks": 22 },
    { "date": "Sep 05", "clicks": 11 }
  ],
  "meta": { "window_days": 7, "total": 33, "link_id": null }
}
GET /analytics/breakdown

एक आयाम के अनुसार समूहित क्लिक, हर पंक्ति के कुल हिस्से के साथ।

क्वेरी पैरामीटर

  • dimension string

    channel, referrer, device, browser, os, brand, variation या country। browser, os, brand और variation के लिए link_id ज़रूरी है।

    आवश्यक
  • link_id integer

    एक लिंक तक सीमित करें। पूरे वर्कस्पेस के लिए छोड़ दें।

    वैकल्पिक
  • limit integer

    1–100। डिफ़ॉल्ट 10 है।

    वैकल्पिक
रिस्पॉन्स 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 पेजिनेटेड

वर्कस्पेस के हर लिंक की कच्ची विज़िट फ़ीड, सबसे नई पहले। यह GET /visits का आधुनिक विकल्प है: वही डेटा, मानक लिफ़ाफ़ा, limit और offset सपोर्ट।

रिस्पॉन्स 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 }
}

वेबहुक

GET /hooks

इस अकाउंट पर रजिस्टर्ड वेबहुक एंडपॉइंट।

POST /hooks

हर दर्ज क्लिक पर JSON पेलोड पाने के लिए एक HTTPS एंडपॉइंट रजिस्टर करें। हर अकाउंट के लिए 25 तक। विफल डिलीवरी अपने-आप फिर से भेजी जाती हैं।

JSON बॉडी

  • target_url

    https:// होना चाहिए।

    आवश्यक
  • event

    डिफ़ॉल्ट link_visited है, जो अभी एकमात्र इवेंट है।

    वैकल्पिक
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}

एक वेबहुक एंडपॉइंट हटाएँ। Zapier के REST Hook फ़्लो के लिए POST /hooks/subscribe और DELETE /hooks/unsubscribe/{id} उपलब्ध रहते हैं।

पुराना

GET /auth/me पुराना

मूल कनेक्शन टेस्ट: आपका user id, ईमेल और workspace id/नाम एक सपाट ऑब्जेक्ट के रूप में लौटाता है। GET /me यही पहचान और साथ में आपके प्लान की सीमाएँ और फ़ीचर फ़्लैग लौटाता है, और नए कोड के लिए बेहतर विकल्प है।

GET cURL
curl -H "X-API-KEY: YOUR_TOKEN" \
  https://letl.ink/api/v1/auth/me
रिस्पॉन्स 200
{
  "id": 1,
  "email": "[email protected]",
  "workspace_id": 12,
  "workspace_name": "My Workspace"
}
GET /visits पुराना

पूरे वर्कस्पेस की 50 सबसे हालिया विज़िट, एक सादा JSON array के रूप में — बिना किसी लिफ़ाफ़े के — visit_id, visit_time, link_shortcode और visitor_* फ़ील्ड नामों के साथ। Zapier का REST Hook "perform list" स्टेप यही पढ़ता है, इसलिए इसका ढाँचा स्थिर (फ़्रोज़न) है। नए काम के लिए GET /events का उपयोग करें।

POST /hooks/subscribe Zapier

REST Hook सब्सक्राइब। target_url और एक वैकल्पिक event (डिफ़ॉल्ट link_visited) लेता है और बना हुआ सब्सक्रिप्शन बिना किसी लिफ़ाफ़े के सीधे लौटाता है। POST /hooks स्टैंडर्ड रूप में यही ऑपरेशन है।

DELETE /hooks/unsubscribe/{id} Zapier

REST Hook अनसब्सक्राइब, जो {"success": true} लौटाता है। DELETE /hooks/{id} स्टैंडर्ड रूप में इसका समकक्ष है।

त्रुटियाँ

  • 400 invalid_request

    बॉडी JSON ऑब्जेक्ट नहीं थी, या कोई ज़रूरी फ़ील्ड गायब था।

  • 400 invalid_parameter

    कोई क्वेरी पैरामीटर गलत था या उसकी अनुमत सूची से बाहर था। details.parameter उस पैरामीटर का नाम बताता है।

  • 401 unauthenticated

    कोई टोकन नहीं भेजा गया। X-API-KEY या Authorization: Bearer जोड़ें।

  • 401 invalid_token

    यह टोकन किसी अकाउंट से मेल नहीं खाता। हो सकता है इसे दोबारा बनाया गया हो।

  • 403 plan_required

    अकाउंट के प्लान में यह एंडपॉइंट या फ़ीचर शामिल नहीं है। details.upgrade_url बिलिंग की ओर इशारा करता है।

  • 403 forbidden

    ऑथेंटिकेटेड, लेकिन अनुमति नहीं — जैसे कोई सदस्य केवल-मालिक वाली कार्रवाई करने की कोशिश करे।

  • 404 not_found

    इस वर्कस्पेस में ऐसा कोई संसाधन नहीं। दूसरे वर्कस्पेस की ids को निषिद्ध की बजाय नहीं मिला के रूप में बताया जाता है।

  • 409 conflict

    रिक्वेस्ट मौजूदा स्थिति से टकराती है — वेबहुक सीमा पूरी हो चुकी है, या अकाउंट में अभी कोई वर्कस्पेस नहीं है।

  • 422

    POST /links/bulk द्वारा तब लौटाया जाता है जब बैच की हर पंक्ति विफल हो जाए। meta.errors देखें।

  • 429 rate_limited

    पिछले मिनट में 600 से ज़्यादा अनुरोध। Retry-After सेकंड तक रुकें।

पुराने GET /visits और GET /links/{id}/visits एंडपॉइंट अपने फ़ील्ड नामों के साथ एक सादा JSON array लौटाते हैं और उन पर पहले से बने Zapier इंटीग्रेशन के लिए फ़्रोज़न हैं। नए कोड में GET /events और GET /links/{id}/events का उपयोग करें, जो मानक लिफ़ाफ़ा इस्तेमाल करते हैं और पेजिनेशन सपोर्ट करते हैं।

अब भी कोई सवाल है?

हम मदद के लिए यहाँ हैं। संपर्क करें और हम जल्द से जल्द आपको जवाब देंगे।