Geliştiriciler

Geliştiriciler için API Referansı

İsteklerin sistem tarafından işlenmesi için bir API anahtarı gereklidir. Bir kullanıcı kaydolduktan sonra bu kullanıcı için otomatik olarak bir API anahtarı oluşturulur.

Başlarken

İsteklerin sistem tarafından işlenmesi için bir API anahtarı gereklidir. Bir kullanıcı kaydolduktan sonra bu kullanıcı için otomatik olarak bir API anahtarı oluşturulur. API anahtarının her istekle birlikte gönderilmesi gerekir (aşağıdaki tam örneğe bakın). API anahtarı gönderilmezse veya süresi dolmuşsa hata oluşacaktır. Kötüye kullanımı önlemek için lütfen API anahtarınızı gizli tuttuğunuzdan emin olun.

Kimlik doğrulama

API sistemiyle kimlik doğrulaması yapmak için her istekle birlikte API anahtarınızı bir yetkilendirme belirteci olarak göndermeniz gerekir. Aşağıda örnek kodu görebilirsiniz.

curl --location --request POST 'https://kslnk.com/api/account' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \ 

Oran Limiti

API'miz, kararlılığını en üst düzeye çıkarmak için isteklerdeki ani artışlara karşı koruma sağlayacak bir hız sınırlayıcıya sahiptir. Hız sınırlayıcımız şu anda 1 dakika başına 30 istekle sınırlıdır. Ücretin abone olunan plana göre değişebileceğini lütfen unutmayın.

Yanıtla birlikte birkaç başlık gönderilecektir ve bunlar, istekle ilgili çeşitli bilgileri belirlemek için incelenebilir.

X-RateLimit-Limit: 30X-RateLimit-Remaining: 29X-RateLimit-Reset: TIMESTAMP

Yanıt İşleme

Tüm API yanıtları varsayılan olarak JSON biçiminde döndürülür. Bunu kullanılabilir verilere dönüştürmek için dile göre uygun fonksiyonun kullanılması gerekecektir. PHP'de json_decode() işlevi, verileri bir nesneye (varsayılan) veya diziye (ikinci parametreyi true olarak ayarlayın) dönüştürmek için kullanılabilir. Hatanın olup olmadığı konusunda bilgi veren hata anahtarının kontrol edilmesi oldukça önemlidir. Başlık kodunu da kontrol edebilirsiniz.

{
    "error": 1,
    "message": "An error occurred"
}

CTA Yer Paylaşımları

List CTA Overlays

GET https://kslnk.com/api/overlay?limit=2&page=1

To get cta overlays via the API, you can use this endpoint. You can also filter data (See table for more info).

Parametre Açıklama
limit (optional) Per page data result
page (optional) Current page request
curl --location --request GET 'https://kslnk.com/api/overlay?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": "0",
    "data": {
        "result": 2,
        "perpage": 2,
        "currentpage": 1,
        "nextpage": 1,
        "maxpage": 1,
        "cta": [
            {
                "id": 1,
                "type": "message",
                "name": "Product 1 Promo",
                "date": "2020-11-10 18:00:00"
            },
            {
                "id": 2,
                "type": "contact",
                "name": "Contact Page",
                "date": "2020-11-10 18:10:00"
            }
        ]
    }
}

Hesap

Hesap Al

GET https://kslnk.com/api/account

Hesapla ilgili bilgi almak için bu uç noktaya bir istek gönderebilirsiniz ve bu, hesapla ilgili verileri döndürür.

curl --location --request GET 'https://kslnk.com/api/account' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "data": {
        "id": 1,
        "email": "[email protected]",
        "username": "sampleuser",
        "avatar": "https:\/\/domain.com\/content\/avatar.png",
        "status": "pro",
        "expires": "2022-11-15 15:00:00",
        "registered": "2020-11-10 18:01:43"
    }
}

Hesabı güncelle

PUT https://kslnk.com/api/account/update

Hesapla ilgili bilgileri güncellemek için bu uç noktaya bir istek gönderebilirsiniz; bu, hesaptaki verileri güncelleyecektir.

curl --location --request PUT 'https://kslnk.com/api/account/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "email": "[email protected]",
    "password": "NewPassword1"
}'

Sunucu yanıtı

{
    "error": 0,
    "message": "Account has been successfully updated."
}

Kanallar

List Channels

GET https://kslnk.com/api/channels?limit=2&page=1

To get your channels via the API, you can use this endpoint. You can also filter data (See table for more info).

Parametre Açıklama
limit (optional) Per page data result
page (optional) Current page request
curl --location --request GET 'https://kslnk.com/api/channels?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": "0",
    "data": {
        "result": 2,
        "perpage": 2,
        "currentpage": 1,
        "nextpage": 1,
        "maxpage": 1,
        "channels": [
            {
                "id": 1,
                "name": "Channel 1",
                "description": "Description of channel 1",
                "color": "#000000",
                "starred": true
            },
            {
                "id": 2,
                "name": "Channel 2",
                "description": "Description of channel 2",
                "color": "#FF0000",
                "starred": false
            }
        ]
    }
}

List Channel Items

GET https://kslnk.com/api/channel/:id?limit=1&page=1

To get items in a select channels via the API, you can use this endpoint. You can also filter data (See table for more info).

Parametre Açıklama
limit (optional) Per page data result
page (optional) Current page request
curl --location --request GET 'https://kslnk.com/api/channel/:id?limit=1&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": "0",
    "data": {
        "result": 2,
        "perpage": 2,
        "currentpage": 1,
        "nextpage": 1,
        "maxpage": 1,
        "items": [
            {
                "type": "links",
                "id": 1,
                "title": "My Sample Link",
                "preview": "https:\/\/google.com",
                "link": "https:\/\/kslnk.com\/google",
                "date": "2022-05-12"
            },
            {
                "type": "bio",
                "id": 1,
                "title": "My Sample Bio",
                "preview": "https:\/\/kslnk.com\/mybio",
                "link": "https:\/\/kslnk.com\/mybio",
                "date": "2022-06-01"
            }
        ]
    }
}

Kanal Oluştur

POST https://kslnk.com/api/channel/add

A channel can be added using this endpoint.

Parametre Açıklama
name (required) Channel name
description (optional) Channel description
color (optional) Channel badge color (HEX)
starred (optional) Star the channel or not (true or false)
curl --location --request POST 'https://kslnk.com/api/channel/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "New Channel",
    "description": "my new channel",
    "color": "#000000",
    "starred": true
}'

Sunucu yanıtı

{
    "error": 0,
    "id": 3,
    "name": "New Channel",
    "description": "my new channel",
    "color": "#000000",
    "starred": true
}

Assign an Item to a Channel

POST https://kslnk.com/api/channel/:channelid/assign/:type/:itemid

An item can be assigned to any channel by sending a request with the channel id, item type (links, bio or qr) and item id.

Parametre Açıklama
:channelid (required) Channel ID
:type (required) links or bio or qr
:itemid (required) Item ID
curl --location --request POST 'https://kslnk.com/api/channel/:channelid/assign/:type/:itemid' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "message": "Item successfully added to the channel."
}

Kanalı Güncelle

PUT https://kslnk.com/api/channel/:id/update

To update a channel, you need to send a valid data in JSON via a PUT request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).

Parametre Açıklama
name (optional) Channel name
description (optional) Channel description
color (optional) Channel badge color (HEX)
starred (optional) Star the channel or not (true or false)
curl --location --request PUT 'https://kslnk.com/api/channel/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "Acme Corp",
    "description": "channel for items for Acme Corp",
    "color": "#FFFFFF",
    "starred": false
}'

Sunucu yanıtı

{
    "error": 0,
    "message": "Channel has been updated successfully."
}

Delete Channel

DELETE https://kslnk.com/api/channel/:id/delete

To delete a channel, you need to send a DELETE request. All items will be unassigned as well.

curl --location --request DELETE 'https://kslnk.com/api/channel/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "message": "Channel has been deleted successfully."
}

Markalı Alan Adları

List Branded Domains

GET https://kslnk.com/api/domains?limit=2&page=1

To get your branded domains via the API, you can use this endpoint. You can also filter data (See table for more info).

Parametre Açıklama
limit (optional) Per page data result
page (optional) Current page request
curl --location --request GET 'https://kslnk.com/api/domains?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": "0",
    "data": {
        "result": 2,
        "perpage": 2,
        "currentpage": 1,
        "nextpage": 1,
        "maxpage": 1,
        "domains": [
            {
                "id": 1,
                "domain": "https:\/\/domain1.com",
                "redirectroot": "https:\/\/rootdomain.com",
                "redirect404": "https:\/\/rootdomain.com\/404"
            },
            {
                "id": 2,
                "domain": "https:\/\/domain2.com",
                "redirectroot": "https:\/\/rootdomain2.com",
                "redirect404": "https:\/\/rootdomain2.com\/404"
            }
        ]
    }
}

Create a Branded Domain

POST https://kslnk.com/api/domain/add

A domain can be added using this endpoint. Please make sure the domain is correctly pointed to our server.

Parametre Açıklama
domain (required) Branded domain including http or https
redirectroot (optional) Root redirect when someone visits your domain
redirect404 (optional) Custom 404 redirect
curl --location --request POST 'https://kslnk.com/api/domain/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "domain": "https:\/\/domain1.com",
    "redirectroot": "https:\/\/rootdomain.com",
    "redirect404": "https:\/\/rootdomain.com\/404"
}'

Sunucu yanıtı

{
    "error": 0,
    "id": 1
}

Alan Adını Güncelle

PUT https://kslnk.com/api/domain/:id/update

To update a branded domain, you need to send a valid data in JSON via a PUT request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).

Parametre Açıklama
redirectroot (optional) Root redirect when someone visits your domain
redirect404 (optional) Custom 404 redirect
curl --location --request PUT 'https://kslnk.com/api/domain/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "redirectroot": "https:\/\/rootdomain-new.com",
    "redirect404": "https:\/\/rootdomain-new.com\/404"
}'

Sunucu yanıtı

{
    "error": 0,
    "message": "Domain has been updated successfully."
}

Delete Domain

DELETE https://kslnk.com/api/domain/:id/delete

To delete a domain, you need to send a DELETE request.

curl --location --request DELETE 'https://kslnk.com/api/domain/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "message": "Domain has been deleted successfully."
}

Piksel

List Pixels

GET https://kslnk.com/api/pixels?limit=2&page=1

To get your pixels codes via the API, you can use this endpoint. You can also filter data (See table for more info).

Parametre Açıklama
limit (optional) Per page data result
page (optional) Current page request
curl --location --request GET 'https://kslnk.com/api/pixels?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": "0",
    "data": {
        "result": 2,
        "perpage": 2,
        "currentpage": 1,
        "nextpage": 1,
        "maxpage": 1,
        "pixels": [
            {
                "id": 1,
                "type": "gtmpixel",
                "name": "GTM Pixel",
                "tag": "GA-123456789",
                "date": "2020-11-10 18:00:00"
            },
            {
                "id": 2,
                "type": "twitterpixel",
                "name": "Twitter Pixel",
                "tag": "1234567",
                "date": "2020-11-10 18:10:00"
            }
        ]
    }
}

Create a Pixel

POST https://kslnk.com/api/pixel/add

A pixel can be created using this endpoint. You need to send the pixel type and the tag.

Parametre Açıklama
type (required) gtmpixel | gapixel | fbpixel | adwordspixel | linkedinpixel | twitterpixel | adrollpixel | quorapixel | pinterest | bing | snapchat | reddit | tiktok
name (required) Custom name for your pixel
tag (required) The tag for the pixel
curl --location --request POST 'https://kslnk.com/api/pixel/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "type": "gtmpixel",
    "name": "My GTM",
    "tag": "GTM-ABCDE"
}'

Sunucu yanıtı

{
    "error": 0,
    "id": 1
}

Pixel'i Güncelle

PUT https://kslnk.com/api/pixel/:id/update

To update a pixel, you need to send a valid data in JSON via a PUT request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).

Parametre Açıklama
name (optional) Custom name for your pixel
tag (required) The tag for the pixel
curl --location --request PUT 'https://kslnk.com/api/pixel/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "My GTM",
    "tag": "GTM-ABCDE"
}'

Sunucu yanıtı

{
    "error": 0,
    "message": "Pixel has been updated successfully."
}

Delete Pixel

DELETE https://kslnk.com/api/pixel/:id/delete

To delete a pixel, you need to send a DELETE request.

curl --location --request DELETE 'https://kslnk.com/api/pixel/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "message": "Pixel has been deleted successfully."
}

QR Kodları

List QR codes

GET https://kslnk.com/api/qr?limit=2&page=1

API üzerinden QR kodlarınızı almak için bu uç noktayı kullanabilirsiniz. Ayrıca verileri filtreleyebilirsiniz (Daha fazla bilgi için tabloya bakın).

Parametre Açıklama
limit (optional) Per page data result
page (optional) Current page request
curl --location --request GET 'https://kslnk.com/api/qr?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": "0",
    "data": {
        "result": 2,
        "perpage": 2,
        "currentpage": 1,
        "nextpage": 1,
        "maxpage": 1,
        "qrs": [
            {
                "id": 2,
                "link": "https:\/\/kslnk.com\/qr\/a2d5e",
                "scans": 0,
                "name": "Google",
                "date": "2020-11-10 18:01:43"
            },
            {
                "id": 1,
                "link": "https:\/\/kslnk.com\/qr\/b9edfe",
                "scans": 5,
                "name": "Google Canada",
                "date": "2020-11-10 18:00:25"
            }
        ]
    }
}

Tek bir QR Kodu alın

GET https://kslnk.com/api/qr/:id

API aracılığıyla tek bir QR kodunun ayrıntılarını almak için bu uç noktayı kullanabilirsiniz.

curl --location --request GET 'https://kslnk.com/api/qr/:id' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "details": {
        "id": 1,
        "link": "https:\/\/kslnk.com\/qr\/b9edfe",
        "scans": 5,
        "name": "Google Canada",
        "date": "2020-11-10 18:00:25"
    },
    "data": {
        "clicks": 1,
        "uniqueClicks": 1,
        "topCountries": {
            "Unknown": "1"
        },
        "topReferrers": {
            "Direct, email and other": "1"
        },
        "topBrowsers": {
            "Chrome": "1"
        },
        "topOs": {
            "Windows 10": "1"
        },
        "socialCount": {
            "facebook": 0,
            "twitter": 0,
            "instagram": 0
        }
    }
}

QR Kodu Oluşturun

POST https://kslnk.com/api/qr/add

To create a QR Code, you need to send a valid data in JSON via a POST request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).

Parametre Açıklama
type (required) text | vcard | link | email | phone | sms | wifi
data (required) Data to be embedded inside the QR code. The data can be string or array depending on the type
background (optional) RGB color e.g. rgb(255,255,255)
foreground (optional) RGB color e.g. rgb(0,0,0)
logo (optional) Path to the logo either png or jpg
name (optional) QR Code name
curl --location --request POST 'https://kslnk.com/api/qr/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "type": "link",
    "data": "https:\/\/google.com",
    "background": "rgb(255,255,255)",
    "foreground": "rgb(0,0,0)",
    "logo": "https:\/\/site.com\/logo.png",
    "name": "QR Code API"
}'

Sunucu yanıtı

{
    "error": 0,
    "id": 3,
    "link": "https:\/\/kslnk.com\/qr\/a58f79"
}

Update QR Code

PUT https://kslnk.com/api/qr/:id/update

Bir QR Kodunu güncellemek için, bir PUT isteği aracılığıyla JSON'da geçerli bir veri göndermeniz gerekir. Veriler, aşağıda gösterildiği gibi isteğinizin ham gövdesi olarak gönderilmelidir. Aşağıdaki örnek, gönderebileceğiniz tüm parametreleri gösterir, ancak hepsini göndermeniz gerekmez (Daha fazla bilgi için tabloya bakın).

Parametre Açıklama
data (required) Data to be embedded inside the QR code. The data can be string or array depending on the type
background (optional) RGB color e.g. rgb(255,255,255)
foreground (optional) RGB color e.g. rgb(0,0,0)
logo (optional) Path to the logo either png or jpg
curl --location --request PUT 'https://kslnk.com/api/qr/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "type": "link",
    "data": "https:\/\/google.com",
    "background": "rgb(255,255,255)",
    "foreground": "rgb(0,0,0)",
    "logo": "https:\/\/site.com\/logo.png"
}'

Sunucu yanıtı

{
    "error": 0,
    "message": "QR has been updated successfully."
}

QR Kodunu Sil

DELETE https://kslnk.com/api/qr/:id/delete

Bir QR kodunu silmek için bir DELETE isteği göndermeniz gerekir.

curl --location --request DELETE 'https://kslnk.com/api/qr/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "message": "QR Code has been deleted successfully."
}

kampanyalar

List Campaigns

GET https://kslnk.com/api/campaigns?limit=2&page=1

To get your campaigns via the API, you can use this endpoint. You can also filter data (See table for more info).

Parametre Açıklama
limit (optional) Per page data result
page (optional) Current page request
curl --location --request GET 'https://kslnk.com/api/campaigns?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": "0",
    "data": {
        "result": 2,
        "perpage": 2,
        "currentpage": 1,
        "nextpage": 1,
        "maxpage": 1,
        "campaigns": [
            {
                "id": 1,
                "name": "Sample Campaign",
                "public": false,
                "rotator": false,
                "list": "https:\/\/domain.com\/u\/admin\/list-1"
            },
            {
                "id": 2,
                "domain": "Facebook Campaign",
                "public": true,
                "rotator": "https:\/\/domain.com\/r\/test",
                "list": "https:\/\/domain.com\/u\/admin\/test-2"
            }
        ]
    }
}

Kampanya Oluştur

POST https://kslnk.com/api/campaign/add

A campaign can be added using this endpoint.

Parametre Açıklama
name (optional) Campaign name
slug (optional) Rotator Slug
public (optional) Access
curl --location --request POST 'https://kslnk.com/api/campaign/add' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "New Campaign",
    "slug": "new-campaign",
    "public": true
}'

Sunucu yanıtı

{
    "error": 0,
    "id": 3,
    "domain": "New Campaign",
    "public": true,
    "rotator": "https:\/\/domain.com\/r\/new-campaign",
    "list": "https:\/\/domain.com\/u\/admin\/new-campaign-3"
}
POST https://kslnk.com/api/campaign/:campaignid/assign/:linkid

A short link can be assigned to a campaign using this endpoint. The endpoint requires the campaign ID and the short link ID.

curl --location --request POST 'https://kslnk.com/api/campaign/:campaignid/assign/:linkid' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "message": "Link successfully added to the campaign."
}

Kampanyayı Güncelle

PUT https://kslnk.com/api/campaign/:id/update

To update a campaign, you need to send a valid data in JSON via a PUT request. The data must be sent as the raw body of your request as shown below. The example below shows all the parameters you can send but you are not required to send all (See table for more info).

Parametre Açıklama
name (required) Campaign name
slug (optional) Rotator Slug
public (optional) Access
curl --location --request PUT 'https://kslnk.com/api/campaign/:id/update' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "Twitter Campaign",
    "slug": "twitter-campaign",
    "public": true
}'

Sunucu yanıtı

{
    "error": 0,
    "id": 3,
    "domain": "Twitter Campaign",
    "public": true,
    "rotator": "https:\/\/domain.com\/r\/twitter-campaign",
    "list": "https:\/\/domain.com\/u\/admin\/twitter-campaign-3"
}

Delete Campaign

DELETE https://kslnk.com/api/campaign/:id/delete

To delete a campaign, you need to send a DELETE request.

curl --location --request DELETE 'https://kslnk.com/api/campaign/:id/delete' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": 0,
    "message": "Campaign has been deleted successfully."
}

Özel Açılış Sayfası

List Custom Splash

GET https://kslnk.com/api/splash?limit=2&page=1

To get Splash Pages via the API, you can use this endpoint. You can also filter data (See table for more info).

Parametre Açıklama
limit (optional) Per page data result
page (optional) Current page request
curl --location --request GET 'https://kslnk.com/api/splash?limit=2&page=1' \
--header 'Authorization: Bearer YOURAPIKEY' \
--header 'Content-Type: application/json' \

Sunucu yanıtı

{
    "error": "0",
    "data": {
        "result": 2,
        "perpage": 2,
        "currentpage": 1,
        "nextpage": 1,
        "maxpage": 1,
        "splash": [
            {
                "id": 1,
                "name": "Product 1 Promo",
                "date": "2020-11-10 18:00:00"
            },
            {
                "id": 2,
                "name": "Product 2 Promo",
                "date": "2020-11-10 18:10:00"
            }
        ]
    }
}