Kotlin Examples

Complete examples for using the yLnk API with Kotlin.

Setup

import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.http.*
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json
import kotlinx.serialization.encodeToString

class YLnkAPI(private val apiKey: String) {
    private val baseUrl = "https://api.ylnk.cc/v2/external/client"
    private val client = HttpClient()
    private val json = Json { ignoreUnknownKeys = true }

    private suspend fun request(
        method: HttpMethod,
        endpoint: String,
        body: Any? = null,
        params: Map<String, String> = emptyMap()
    ): Map<String, Any> {
        val url = buildString {
            append(baseUrl)
            append(endpoint)
            if (params.isNotEmpty()) {
                append("?")
                append(params.entries.joinToString("&") { "${it.key}=${it.value}" })
            }
        }

        val response = client.request(url) {
            this.method = method
            headers {
                append("X-API-Key", apiKey)
                append("Content-Type", "application/json")
            }
            if (body != null) {
                setBody(json.encodeToString(body))
            }
        }

        val result: Map<String, Any> = json.decodeFromString(response.bodyAsText())
        return result["data"] as Map<String, Any>
    }
}
@Serializable
data class CreateLinkRequest(
    val originalUrl: String,
    val title: String? = null,
    val customUrl: String? = null,
    val category: String? = null,
    val categoryTitle: String? = null,
    val categoryValue: String? = null
)

suspend fun createShortLink(
    originalUrl: String,
    title: String? = null,
    customUrl: String? = null
): Map<String, Any> {
    val request = CreateLinkRequest(originalUrl, title, customUrl)
    return api.request(HttpMethod.Post, "/short-links", request)
}

// Usage
val link = createShortLink(
    originalUrl = "https://example.com/very/long/url",
    title = "My Link",
    customUrl = "my-link"
)
println("Created: ${link["shortUrl"]}")
@Serializable
data class UpdateLinkRequest(
    val id: String,
    val title: String? = null,
    val shortUrl: String? = null,
    val isActive: Boolean
)

suspend fun updateShortLink(
    id: String,
    title: String? = null,
    isActive: Boolean = true
): Map<String, Any> {
    val request = UpdateLinkRequest(id, title, null, isActive)
    return api.request(HttpMethod.Put, "/short-links/$id", request)
}

// Usage
val updated = updateShortLink("abc123", title = "Updated Title", isActive = true)
suspend fun listShortLinks(
    page: Int = 1,
    size: Int = 10,
    search: String? = null,
    status: String? = null
): Map<String, Any> {
    val params = buildMap {
        put("page", page.toString())
        put("size", size.toString())
        search?.let { put("search", it) }
        status?.let { put("status", it) }
    }
    return api.request(HttpMethod.Get, "/short-links", params = params)
}

// Usage
val links = listShortLinks(page = 1, size = 20, search = "example", status = "active")
val total = links["totalElements"] as Int
println("Total: $total")
suspend fun getShortLink(id: String): Map<String, Any> {
    return api.request(HttpMethod.Get, "/short-links/$id")
}

// Usage
val link = getShortLink("abc123")
val clicks = link["visitCount"] as Int
println("Clicks: $clicks")

Get Analytics Details

suspend fun getAnalyticsDetails(shortUrl: String): Map<String, Any> {
    val params = mapOf("shortUrl" to shortUrl)
    return api.request(HttpMethod.Get, "/analytics/details", params = params)
}

// Usage
val details = getAnalyticsDetails("abc123")
val clicks = details["visitCount"] as Int
println("Total clicks: $clicks")

Get Click Traffic

suspend fun getClickTraffic(shortUrl: String): Map<String, Any> {
    val params = mapOf("shortUrl" to shortUrl)
    return api.request(HttpMethod.Get, "/analytics/click-traffic-platforms", params = params)
}

// Usage
val traffic = getClickTraffic("abc123")
val clicksByCountry = traffic["clicksTraffic"] as Map<String, Int>
val topPlatforms = traffic["topPlatforms"] as Map<String, Int>
println("Clicks by country: $clicksByCountry")
println("Top platforms: $topPlatforms")

Get Visit Logs

suspend fun getVisitLogs(
    shortUrl: String,
    startDate: String,
    endDate: String,
    page: Int = 1,
    pageSize: Int = 10
): Map<String, Any> {
    val params = mapOf(
        "shortUrl" to shortUrl,
        "startDate" to startDate,
        "endDate" to endDate,
        "page" to page.toString(),
        "pageSize" to pageSize.toString()
    )
    return api.request(HttpMethod.Get, "/analytics/visit-logs", params = params)
}

// Usage
val logs = getVisitLogs("abc123", "2024-01-01", "2024-01-31", page = 1, pageSize = 20)
val total = logs["totalElements"] as Int
println("Total visits: $total")
val content = logs["content"] as List<Map<String, Any>>
content.forEach { log ->
    println("${log["countryName"]}: ${log["browserName"]} on ${log["osName"]}")
}

Filter Visit Logs by UTM

suspend fun filterVisitLogs(
    shortUrl: String,
    startDate: String,
    endDate: String,
    utmSource: String? = null,
    utmMedium: String? = null,
    utmCampaign: String? = null
): Int {
    val params = buildMap {
        put("shortUrl", shortUrl)
        put("startDate", startDate)
        put("endDate", endDate)
        utmSource?.let { put("utmSource", it) }
        utmMedium?.let { put("utmMedium", it) }
        utmCampaign?.let { put("utmCampaign", it) }
    }
    val result = api.request(HttpMethod.Get, "/analytics/filter-visit-logs", params = params)
    return result as Int
}

// Usage
val count = filterVisitLogs(
    shortUrl = "abc123",
    startDate = "2024-01-01",
    endDate = "2024-01-31",
    utmSource = "google",
    utmMedium = "cpc",
    utmCampaign = "summer-sale"
)
println("Matching visits: $count")