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

संकेत

हे खालील प्रत्येक एंडपॉइंटवर लागू होते.

रिस्पॉन्स एन्व्हलप

प्रत्येक यशस्वी प्रतिसाद data की असलेला JSON ऑब्जेक्ट असतो, आणि निकालाबद्दल सांगण्यासारखे काही असल्यास 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 सांगतो, त्यामुळे गणित न करता पेजिंग करता येते: has_more हे false होईपर्यंत offset = meta.next_offset सह कॉल करत रहा.

प्रत्येक लिंकमधून पेजिंग
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 टाइमस्टॅम्प) असतात. मर्यादा ओलांडल्यास सेकंदांमधील Retry-After हेडरसह 429 rate_limited मिळतो. लगेच पुन्हा प्रयत्न करण्याऐवजी 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 जुने

मूळ कनेक्शन टेस्ट: तुमचा युजर id, ईमेल आणि वर्कस्पेस 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 ॲरे स्वरूपात — एन्व्हलपशिवाय — 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

    या वर्कस्पेसमध्ये असे संसाधन नाही. दुसऱ्या वर्कस्पेसचे id निषिद्ध म्हणून नव्हे, तर सापडले नाही म्हणून कळवले जातात.

  • 409 conflict

    रिक्वेस्ट सध्याच्या स्थितीशी विसंगत आहे — वेबहुक मर्यादा गाठली आहे, किंवा खात्याला अजून वर्कस्पेस नाही.

  • 422

    बॅचमधील प्रत्येक ओळ अयशस्वी झाल्यावर POST /links/bulk द्वारे परत केले जाते. meta.errors तपासा.

  • 429 rate_limited

    गेल्या मिनिटात 600 पेक्षा जास्त विनंत्या. Retry-After सेकंद थांबा.

जुने GET /visits आणि GET /links/{id}/visits एंडपॉइंट स्वतःच्या फील्ड नावांसह साधा JSON ॲरे परत करतात आणि त्यांच्यावर आधीच तयार केलेल्या Zapier इंटिग्रेशनसाठी गोठवलेले आहेत. नवीन कोडने GET /events आणि GET /links/{id}/events वापरावे, जे स्टँडर्ड एन्व्हलप वापरतात आणि पेजिनेशनला सपोर्ट करतात.

अजून प्रश्न आहेत?

आम्ही मदतीसाठी इथे आहोत. संपर्क साधा आणि आम्ही लवकरात लवकर उत्तर देऊ.