Vivoldi API URL Pendek untuk Pengembang

Panduan REST API untuk Membuat URL Pendek

Vivoldi menyediakan REST API khusus yang dapat diintegrasikan dengan mulus ke dalam situs web, aplikasi seluler, atau sistem internal Anda.
Dengan API ini, Anda dapat membuat dan mengelola URL pendek langsung dari server atau aplikasi Anda tanpa mengakses antarmuka Vivoldi.

REST API dirancang untuk bekerja dengan berbagai bahasa pemrograman dan platform termasuk JavaScript, PHP, Java, Android, dan iOS.
Sebelum menggunakan API, Anda harus membuat API Key dan menyimpannya dengan aman tanpa mengeksposnya ke pihak ketiga.

API Key dapat diperbarui sekali setiap bulan, dan URL pendek yang sudah ada tidak akan terpengaruh.
Semua pengguna, termasuk yang menggunakan paket gratis, dapat mengakses API, tetapi frekuensi permintaan dan kecepatan respons dapat bervariasi tergantung paket Anda.

Jika Anda mengalami kesalahan HTTP 403 saat memanggil API, harap tentukan nilai User-Agent yang unik di header permintaan Anda.
Vivoldi secara aktif memblokir perayap dan bot berbahaya dan memelihara daftar hitam internal alamat IP.
Untuk memastikan komunikasi API yang stabil, gunakan nama perusahaan atau merek Anda (dalam bahasa Inggris) sebagai string Agen-Pengguna.

Vivoldi dapat me-reboot server selama penerapan fitur, patch keamanan, atau pemeliharaan sistem.
Untuk mencegah gangguan, kami sangat menyarankan untuk menerapkan logika coba lagi untuk semua permintaan API.

Vivoldi API URL Pendek untuk Pengembang

Cara memanggil API

Request:
Host: https://vivoldi.com/api HTTP/1.1
Authorization: APIKey {Your API Key}
Content-type: application/json
Cukup tambahkan Otorisasi, Jenis konten ke Header Http Anda dan panggil API.
Response:
{
    "code": 0,
    "message": "",
    "result": Object
}
code - Kode respons, di mana 0 adalah sukses dan nilai lainnya adalah kode kegagalan.
message - Pesan respons, pesan kesalahan dikembalikan jika kode respons bukan nol.
result - Nilai respons, dikembalikan sebagai karakter atau objek JSON tergantung pada jenis API.
Silakan hubungi Vivoldi jika Anda membutuhkan peningkatan atau modifikasi REST API.

Buat tautan

Jika Anda ingin membuat satu tautan pendek, Anda dapat dengan mudah membuatnya menggunakan API ini.
Untuk membuat beberapa tautan sekaligus, coba gunakan API Pembuatan Tautan Massal .
Anda juga dapat membuat tautan dengan cepat melalui menu "Pembuat Tautan Massal" di dasbor.

Untuk pengguna paket gratis, panggilan API dibatasi hingga 10 permintaan per menit.
Jika Anda membutuhkan volume yang lebih tinggi, pertimbangkan untuk meningkatkan ke paket berbayar untuk akses yang lebih luas.

Setiap tautan pendek secara otomatis menyertakan kode QR, yang dapat diakses melalui format URL `vvd.bz/[linkId]/qr`.
Untuk menyesuaikan ukuran kode QR, cukup tambahkan parameter `size` ke URL.
Sebagai contoh, gunakan `vvd.bz/[linkId]/qr?size=200` untuk menghasilkan kode QR dengan ukuran 200 piksel.

Request:
Post /api/link/v2/create HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
urlURL Panjang URL panjang yang akan menjadi tujuan saat tautan pendek yang dibuat diklik.
Panjang maksimal 3.000 byte.
string
domainDomain Jika dikosongkan, otomatis akan menggunakan domain vvd.bz.
Harus menyertakan "https://", dan jika opsi “brandLinkId” adalah “Y”, gunakan domain “https://vvd.im”.
Jika domain Anda telah terhubung ke Vivoldi, bisa diatur di sini.
Contoh: https://vvd.bz
string
redirectTypeTipe Redirect Mengatur bagaimana perpindahan dari URL pendek ke URL panjang.
Bisa memilih salah satu kode status HTTP: 200, 301, atau 302. Nilai default: 302
Untuk info lebih lanjut, lihat halaman “Glosarium”.
int
grpIdxID Grup Menentukan ID grup akan membuat tautan terhubung ke grup tersebut.
Untuk melihat GroupID, gunakan API “Daftar Grup”.
int
brandLinkIdID Tautan Merek Jika diisi, tautan akan dibuat dengan ID tersebut.
(Jika diatur, domain akan menjadi vvd.im, bukan vvd.bz)
Jika dikosongkan, linkID akan dibuat otomatis.
string
ttlJudul Tautan Jika kosong, akan menggunakan judul halaman web dari URL panjang.
Jika kosong, sistem akan mengakses URL panjang dan melakukan parsing HTML, sehingga jika API terasa lambat, sebaiknya tentukan judulnya.
string
descriptionDeskripsi Meta Bisa diatur sebagai tag meta description halaman jika “redirectType” bernilai “200”.
Nilai ini diabaikan jika “redirectType” adalah “301”, “302”, dsb.
string
memoCatatan Bisa diisi informasi tambahan untuk kebutuhan administrasi dan tidak akan terlihat oleh pengguna. string
notfSubscYnTautan Push Jika bernilai Y, saat tautan diakses, pop-up notifikasi push akan muncul sebelum diarahkan ke URL panjang. Notifikasi dapat dikirim ke semua pengguna yang mengizinkan.
Jika pengguna menolak atau menutup pop-up, langsung diarahkan ke URL panjang.
Jika kosong, default adalah N.
Info lebih lanjut di halaman fitur Web Push.
Y atau N
clksIpFilteringYnIP Filtering Klik Jika bernilai Y, jumlah klik dari IP yang sama dalam 3 hari hanya dihitung 1 kali.
Mulai hari ke-4, klik akan dihitung lagi.
Opsi ini hanya dapat diatur saat pembuatan link, tidak bisa diubah setelahnya.
Fitur tersedia mulai Paket Personal.
Y atau N
pushNotifyYnNotifikasi Push Jika bernilai Y, Anda akan menerima notifikasi push di perangkat dengan aplikasi Vivoldi ketika jumlah klik tercapai (set sesuai pengaturan tautan di menu “Pengaturan -> Preferensi”).
Tersedia mulai Paket Personal.
Y atau N
mailNotifyYnNotifikasi Email Jika bernilai Y, info jumlah klik akan dikirim ke email terdaftar Vivoldi setiap kali target klik tercapai (pengaturan di menu “Pengaturan -> Preferensi”).
Tersedia mulai Paket Personal.
Y atau N
delYmdTanggal Penghapusan Tautan Setelah tanggal yang ditentukan, tautan akan otomatis dihapus oleh sistem.
Siklus penghapusan: setiap jam
Contoh: 2025-12-31
Date
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnCreateLink" type="button">Create Link</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnCreateLink").on('click', function(evt){
		evt.preventDefault();

		$.ajax({
			type: 'POST',
			url: 'https://vivoldi.com/api/link/v2/create',
			data: JSON.stringify({'url':'https://google.com','domain':'https://vvd.bz'}),
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				alert('short url: ' + res.result);
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$url = "https://vivoldi.com/api/link/v2/create";
$params = array (
	"url" => "https://www.facebook.com/vivoldi365",
	"domain" => "https://vvd.bz",
);
$body = json_encode($params);

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX",
	"Content-Type: application/json"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class CreateLink {
    public static void main(String[] args) {
        try (HttpClient client = HttpClient.newBuilder().build()) {
            JSONObject params = new JSONObject();
            params.put("url", "https://www.facebook.com/vivoldi365");
            params.put("domain", "https://vvd.bz");

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/link/v2/create"))
                .header("Content-Type", "application/json")
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .POST(HttpRequest.BodyPublishers.ofString(params.toString()))
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("Short URL: " + json.getString("result"));
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
    }
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":"https://vvd.bz/jH3d"
}
Response:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string
resultNilai respons (tautan yang dipersingkat)string

Membuat Tautan Secara Massal

Membuat beberapa tautan yang dipersingkat sekaligus.
Jika Anda ingin membuat banyak tautan sekaligus, gunakan menu "Buat tautan massal" di dasbor.

Anda hanya dapat membuat tautan dalam jumlah terbatas dalam satu waktu, dan batas per paket adalah sebagai berikut
Jika Anda ingin membuat 3.000 tautan, Anda harus memanggil API ini beberapa kali.

Paket pribadi: Hingga 200
Paket premium: hingga 500
Paket bisnis: hingga 1.000

API ini tersedia mulai dari paket Personal.

Request:
Post /api/link/v1/createBulk HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
BidangJenis
links
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
urlURL Panjang URL panjang yang akan menjadi tujuan saat tautan pendek yang dibuat diklik.
Panjang maksimal 3.000 byte.
string
domainDomain Jika dikosongkan, otomatis akan menggunakan domain vvd.bz.
Harus menyertakan "https://", dan jika opsi “brandLinkId” adalah “Y”, gunakan domain “https://vvd.im”.
Jika domain Anda telah terhubung ke Vivoldi, bisa diatur di sini.
Contoh: https://vvd.bz
string
redirectTypeTipe Redirect Mengatur bagaimana perpindahan dari URL pendek ke URL panjang.
Bisa memilih salah satu kode status HTTP: 200, 301, atau 302. Nilai default: 302
Untuk info lebih lanjut, lihat halaman “Glosarium”.
int
grpIdxID Grup Menentukan ID grup akan membuat tautan terhubung ke grup tersebut.
Untuk melihat GroupID, gunakan API “Daftar Grup”.
int
brandLinkIdID Tautan Merek Jika diisi, tautan akan dibuat dengan ID tersebut.
(Jika diatur, domain akan menjadi vvd.im, bukan vvd.bz)
Jika dikosongkan, linkID akan dibuat otomatis.
string
ttlJudul Tautan Jika kosong, akan menggunakan judul halaman web dari URL panjang.
Jika kosong, sistem akan mengakses URL panjang dan melakukan parsing HTML, sehingga jika API terasa lambat, sebaiknya tentukan judulnya.
string
descriptionDeskripsi Meta Bisa diatur sebagai tag meta description halaman jika “redirectType” bernilai “200”.
Nilai ini diabaikan jika “redirectType” adalah “301”, “302”, dsb.
string
memoCatatan Bisa diisi informasi tambahan untuk kebutuhan administrasi dan tidak akan terlihat oleh pengguna. string
notfSubscYnTautan Push Jika bernilai Y, saat tautan diakses, pop-up notifikasi push akan muncul sebelum diarahkan ke URL panjang. Notifikasi dapat dikirim ke semua pengguna yang mengizinkan.
Jika pengguna menolak atau menutup pop-up, langsung diarahkan ke URL panjang.
Jika kosong, default adalah N.
Info lebih lanjut di halaman fitur Web Push.
Y atau N
clksIpFilteringYnIP Filtering Klik Jika bernilai Y, jumlah klik dari IP yang sama dalam 3 hari hanya dihitung 1 kali.
Mulai hari ke-4, klik akan dihitung lagi.
Opsi ini hanya dapat diatur saat pembuatan link, tidak bisa diubah setelahnya.
Fitur tersedia mulai Paket Personal.
Y atau N
pushNotifyYnNotifikasi Push Jika bernilai Y, Anda akan menerima notifikasi push di perangkat dengan aplikasi Vivoldi ketika jumlah klik tercapai (set sesuai pengaturan tautan di menu “Pengaturan -> Preferensi”).
Tersedia mulai Paket Personal.
Y atau N
mailNotifyYnNotifikasi Email Jika bernilai Y, info jumlah klik akan dikirim ke email terdaftar Vivoldi setiap kali target klik tercapai (pengaturan di menu “Pengaturan -> Preferensi”).
Tersedia mulai Paket Personal.
Y atau N
delYmdTanggal Penghapusan Tautan Setelah tanggal yang ditentukan, tautan akan otomatis dihapus oleh sistem.
Siklus penghapusan: setiap jam
Contoh: 2025-12-31
Date
array
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnCreateBulkLinks" type="button">Create bulk links</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnCreateBulkLinks").on('click', function(evt){
		evt.preventDefault();
		const params = {
			'links': [
				{'url':'https://google.com','domain':'https://vvd.bz'},
				{'url':'https://facebook.com','domain':'https://vvd.bz'},
				{'url':'https://twitter.com','domain':'https://vvd.bz'}
			]
		};
		$.ajax({
			type: 'POST',
			url: 'https://vivoldi.com/api/link/v1/createBulk',
			data: JSON.stringify(params),
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			timeout: 10000
		}).done(function(res){
			if (res.code === 0) {
				console.log(res.result);
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$url = "https://vivoldi.com/api/link/v1/createBulk";
$params = array (
	"links" => array(
		array(
			"url" => "https://google.com",
			"domain" => "https://vvd.bz"
		),
		array(
			"url" => "https://facebook.com",
			"domain" => "https://vvd.bz"
		),
		array(
			"url" => "https://twitter.com",
			"domain" => "https://vvd.bz"
		)
	)
);
$body = json_encode($params);

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX",
	"Content-Type: application/json"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.json.JSONArray;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class CreateLink {
    public static void main(String[] args) {
        try (HttpClient client = HttpClient.newBuilder().build()) {
			JSONObject link1 = new JSONObject();
			link1.put("url", "https://google.com").put("domain", "https://vvd.bz");

			JSONObject link2 = new JSONObject();
			link2.put("url", "https://facebook.com").put("domain", "https://vvd.bz");

			JSONObject link3 = new JSONObject();
			link3.put("url", "https://twitter.com").put("domain", "https://vvd.bz");

			JSONArray links = new JSONArray();
			links.put(link1);
			links.put(link2);
			links.put(link3);

            JSONObject params = new JSONObject();
            params.put("links", links);

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/link/v2/create"))
                .header("Content-Type", "application/json")
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .POST(HttpRequest.BodyPublishers.ofString(params.toString()))
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("Short URL: " + json.getString("result"));
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
    }
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":[
        {shortUrl: "https://vvd.bz/bbuR", url: "https://google.com"},
        {shortUrl: "https://vvd.bz/bbuS", url: "https://facebook.com"},
        {shortUrl: "https://vvd.bz/bbuT", url: "https://twitter.com"}
    ]
}
Response:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string
resultNilai respons (tautan yang dipersingkat)string

Mengedit tautan

Edit tautan pendek yang Anda buat.
Anda hanya dapat memodifikasi jenis tautan jika berupa URL; jenis lainnya tidak dimodifikasi meskipun panggilan API berhasil.

Request:
Put /api/link/v2/edit HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
linkIdID Tautan ID dari tautan pendek yang dihasilkan.
Contoh:
Jika alamat tautan pendek adalah "https://vvd.bz/fML", maka link ID adalah fML.
string
domainDomain Domain dari alamat tautan pendek.
Contoh:
Jika alamat tautan pendek adalah "https://vvd.bz/fML", domainnya adalah https://vvd.bz.
Penting: Harus memasukkan https:// atau http://.
Jika diatur ke domain yang berbeda dari tautan yang dihasilkan, akan terjadi error.
string
redirectTypeTipe Redirect Mengatur bagaimana navigasi dari URL pendek ke URL panjang.
Bisa memilih salah satu dari 200, 301, atau 302 sebagai kode status HTTP. Default: 302.
Untuk info lebih lanjut tentang metode redirect, lihat halaman “Glosarium”.
int
grpIdxID Grup Mengubah grup tautan yang dihasilkan.
Untuk mengetahui ID grup, gunakan API "Daftar Grup".
int
urlURL Panjang Mengubah URL panjang.
Hanya bisa diubah mulai paket Premium.
string
ttlJudul Tautan Jika kosong, judul tautan tidak diubah. string
descriptionMeta Deskripsi Bisa diatur sebagai meta tag halaman ketika “redirectType” bernilai “200”.
Nilai ini diabaikan jika “redirectType” adalah “301”, “302”, dan seterusnya.
string
memoCatatan Bisa menambahkan informasi administrasi tambahan tanpa ditampilkan ke pengguna.
Jika kosong, catatan tidak diubah.
string
notfSubscYnPush Link Jika bernilai Y, saat link diklik akan muncul pop-up notifikasi push sebelum diarahkan ke URL panjang, dan jika pengguna sudah mengaktifkan push, kamu bisa mengirim pesan push ke semua yang mengizinkan.
Jika menolak atau menutup pop-up, akan langsung diarahkan ke URL panjang.
Jika tidak diisi, default adalah N.
Untuk info lebih lanjut tentang push subscription link, klik di sini.
Y atau N
pushNotifyYnNotifikasi Push Jika bernilai Y, kamu akan menerima notifikasi push ke perangkat mobile dengan aplikasi Vivoldi jika link mencapai jumlah klik yang diatur di menu "Pengaturan -> Preferensi".
Fitur ini tersedia mulai Paket Personal.
Y atau N
mailNotifyYnNotifikasi Email Jika bernilai Y, kamu akan menerima info jumlah klik ke email terdaftar Vivoldi ketika mencapai target klik yang diatur di menu "Pengaturan -> Preferensi".
Fitur ini tersedia mulai Paket Personal.
Y atau N
delYmdTanggal Penghapusan Tautan Setelah tanggal yang diatur, tautan akan otomatis dihapus oleh sistem.
Siklus penghapusan: setiap jam.
Contoh: 2025-12-31
Date
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnUpdateLink" type="button">Update Link</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnUpdateLink").on('click', function(evt){
		evt.preventDefault();

		$.ajax({
			type: 'PUT',
			url: 'https://vivoldi.com/api/link/v2/edit',
			data: JSON.stringify({'linkId':'jH3d','domain':'https://vvd.bz','ttl':'new title','memo':'new my memo'}),
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				alert('Success!');
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$url = "https://vivoldi.com/api/link/v2/edit";
$params = array (
	"linkId" => "4Rt3",
	"domain" => "https://vvd.bz",
	"ttl" => "new title",
	"memo" => "new my memo"
);
$body = json_encode($params);

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX",
	"Content-Type: application/json"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class UpdateLink {
	public static void main(String[] args) {
		try (HttpClient client = HttpClient.newBuilder().build()) {
            JSONObject params = new JSONObject();
            params.put("linkId", "jH3d");
            params.put("domain", "https://vvd.bz");
			params.put("ttl", "new title");
			params.put("memo", "new my memo");

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/link/v2/edit"))
                .header("Content-Type", "application/json")
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .PUT(HttpRequest.BodyPublishers.ofString(params.toString()))
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("success!");
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":""
}
Response:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string

Menghapus tautan

Hapus tautan pendek yang Anda buat.

Request:
Delete /api/link/v1/remove HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: -
Request:
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
linkIdID Tautan ID dari tautan pendek yang dihasilkan.
Contoh:
Jika alamat tautan pendek adalah "https://vvd.bz/fML", maka linkID-nya adalah fML.
URLEncode diperlukan jika menggunakan LinkID bermerek (LinkID yang Anda tentukan sendiri) dan berisi karakter khusus.
string
domainDomain Domain dari alamat tautan pendek.
Contoh:
Jika alamat tautan pendek adalah "https://vvd.bz/fML", maka domainnya adalah https://vvd.bz.
Penting: Nilai harus dimulai dengan https:// atau http://.
Jika Anda mengatur domain berbeda dari tautan pendek yang dihasilkan, akan terjadi error.
Untuk LinkID bermerek (LinkID yang Anda tentukan sendiri), domainnya adalah https://vvd.im.
string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnDeleteLink" type="button">Delete Link</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnDeleteLink").on('click', function(evt){
		evt.preventDefault();

		$.ajax({
			type: 'DELETE',
			url: 'https://vivoldi.com/api/link/v1/remove?linkId=강남스타벅스점&domain=https://vvd.im',
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				alert('Success!');
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$linkId = urlencode("강남스타벅스점");
$url = "https://vivoldi.com/api/link/v1/remove?linkId=$linkId&domain=https://vvd.im";

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class DeleteLink {
	public static void main(String[] args) {
		try (HttpClient client = HttpClient.newBuilder().build()) {
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/link/v1/remove?linkId=강남스타벅스점&domain=https://vvd.im"))
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .DELETE()
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("success!");
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":""
}
Response:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string

Statistik klik berdasarkan waktu dalam sehari

Melihat klik dan kliker dari waktu ke waktu untuk satu tautan.

API ini tersedia mulai dari paket Bisnis.

Request:
Get /api/statistics/v1/clicks-by-time HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: -
Request:
필드필드 설명설명필수유형
linkId링크 ID 링크 ID로 통계를 조회합니다.
브랜드 링크(링크ID를 직접 설정)로 설정된 링크 중 특수문자가 포함되어 있으면 URLEncode가 필요합니다.
string
domain도메인 링크 도메인으로 목록을 조회합니다.
도메인 앞에 반드시 http:// 또는 https:// 값을 붙여야 합니다.
브랜드 링크(링크ID를 직접 설정)가 설정되어 있는 경우 도메인은 https://vvd.bz이 아닌 https://vvd.im 입니다.
string
ymd날짜 해당 날짜의 시간대별 클릭 수와 클릭 사람 수 목록을 조회합니다.
오늘로 부터 최대 7일 전 날짜만 입력할 수 있습니다.
예: 2024-06-14
string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnClickList" type="button">Get click list</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnClickList").on('click', function(evt){
		evt.preventDefault();

		const linkId = 'y6Tg';
		const domain = 'https://vvd.bz';
		const ymd = '2024-06-14';

		$.ajax({
			type: 'GET',
			url: 'https://vivoldi.com/api/statistics/v1/clicks-by-time?linkId='+linkId+'&domain='+domain+'&ymd='+ymd,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				console.log(res);
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$linkId = "y6Tg";
$domain = "https://vvd.bz";
$ymd = "2024-06-14";
$url = "https://vivoldi.com/api/statistics/v1/clicks-by-time?linkId=$linkId&domain=$domain&ymd=$ymd";

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ClickList {
	public static void main(String[] args) {
		try (HttpClient client = HttpClient.newBuilder().build()) {
            String nm = URLEncoder.encode("my test group", StandardCharsets.UTF_8);
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/statistics/v1/clicks-by-time?linkId=y6Tg&domain=https://vvd.bz&ymd=2024-06-14"))
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .GET()
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println(json.getString("result"));
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":[
        {
            "ymd":"2024-06-14",
            "hour":"00",
            "linkId":"y6Tg",
            "domain":"https://vvd.bz",
            "acesCnt":24,
            "pernCnt":17,
        },
        {
            "ymd":"2024-06-14",
            "hour":"08",
            "linkId":"y6Tg",
            "domain":"https://vvd.bz",
            "acesCnt":121,
            "pernCnt":198,
        }
        {
            "ymd":"2024-06-14",
            "hour":"14",
            "linkId":"y6Tg",
            "domain":"https://vvd.bz",
            "acesCnt":84,
            "pernCnt":68,
        }
    ]
}
Response:
필드설명유형
code응답 코드 (0:성공)int
message응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨.string
result 통계 목록:
필드필드 설명설명유형
ymd날짜-string
hour시간00시 ~ 23시string
linkId링크 ID-string
domain도메인-string
acesCnt클릭 수링크 클릭 수int
pernCnt클릭 사람 수링크를 클릭한 사람 수int
array

Statistik klik berdasarkan tanggal

Anda dapat melihat jumlah klik pada satu tautan berdasarkan tanggal dan jumlah orang yang mengekliknya.
Saat mencari, rentang tanggal mulai dan berakhir tidak boleh lebih dari satu bulan.

API ini tersedia mulai dari paket Bisnis.

Request:
Get /api/statistics/v1/clicks-by-date HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: -
Request:
필드필드 설명설명필수유형
linkId링크 ID 링크 ID로 통계를 조회합니다.
브랜드 링크(링크ID를 직접 설정)로 설정된 링크 중 특수문자가 포함되어 있으면 URLEncode가 필요합니다.
string
domain도메인 링크 도메인으로 목록을 조회합니다.
도메인 앞에 반드시 http:// 또는 https:// 값을 붙여야 합니다.
브랜드 링크(링크ID를 직접 설정)가 설정되어 있는 경우 도메인은 https://vvd.bz이 아닌 https://vvd.im 입니다.
string
startYmd시작 날짜 링크를 클릭한 시작 날짜로 클릭 날짜가 시작 날짜와 종료 날짜 사이 포함되어야 합니다.
예: 2024-05-01
string
endYmd종료 날짜 링크를 클릭한 종료 날짜로 클릭 날짜가 시작 날짜와 종료 날짜 사이 포함되어야 합니다.
시작 날짜와 종료 날짜 범위는 최대 1달입니다.
예: 2024-05-31
string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnClickList" type="button">Get click list</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnClickList").on('click', function(evt){
		evt.preventDefault();

		const linkId = 'y6Tg';
		const domain = 'https://vvd.bz';
		const startYmd = '2024-05-01';
		const endYmd = '2024-05-31';

		$.ajax({
			type: 'GET',
			url: 'https://vivoldi.com/api/statistics/v1/clicks-by-date?linkId='+linkId+'&domain='+domain+'&startYmd='+startYmd+'&endYmd='+endYmd,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				console.log(res);
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$linkId = "y6Tg";
$domain = "https://vvd.bz";
$startYmd = "2024-05-01";
$endYmd = "2024-05-31";
$url = "https://vivoldi.com/api/statistics/v1/clicks-by-date?linkId=$linkId&domain=$domain&startYmd=$startYmd&endYmd=$endYmd";

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ClickList {
	public static void main(String[] args) {
		try (HttpClient client = HttpClient.newBuilder().build()) {
            String nm = URLEncoder.encode("my test group", StandardCharsets.UTF_8);
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/statistics/v1/clicks-by-date?linkId=y6Tg&domain=https://vvd.bz&startYmd=2024-05-01&endYmd=2024-05-31"))
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .GET()
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println(json.getString("result"));
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":[
        {
            "ymd":"2024-05-01",
            "linkId":"y6Tg",
            "domain":"https://vvd.bz",
            "acesCnt":384,
            "pernCnt":295,
        },
        {
            "ymd":"2024-05-02",
            "linkId":"y6Tg",
            "domain":"https://vvd.bz",
            "acesCnt":18543,
            "pernCnt":15691,
        }
        {
            "ymd":"2024-05-03",
            "linkId":"y6Tg",
            "domain":"https://vvd.bz",
            "acesCnt":5408,
            "pernCnt":5006,
        }
    ]
}
Response:
필드설명유형
code응답 코드 (0:성공)int
message응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨.string
result 통계 목록:
필드필드 설명설명유형
ymd날짜-string
linkId링크 ID-string
domain도메인-string
acesCnt클릭 수링크 클릭 수int
pernCnt클릭 사람 수링크를 클릭한 사람 수int
array

Daftar Grup

Mendapatkan daftar grup tautan yang dibuat.

Request:
Get /api/group/v1/list HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: -
Request:
필드필드 설명설명필수유형
grpIdx그룹 ID 그룹 ID로 목록을 조회합니다. int
nm그룹 이름 그룹 이름을 설정하면 그룹 목록을 조회할 때 그룹 이름을 검색하여 조회합니다.
그룹 이름 검색은 equals 조회가 아닌 like 조회입니다.
string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnGroupList" type="button">Get group list</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnGroupList").on('click', function(evt){
		evt.preventDefault();

		const nm = encodeURI('my test group');

		$.ajax({
			type: 'GET',
			url: 'https://vivoldi.com/api/group/v1/list?nm='+nm,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				console.log(res);
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$nm = urlencode("my test group");
$url = "https://vivoldi.com/api/group/v1/list?nm=$nm";

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class GroupList {
	public static void main(String[] args) {
		try (HttpClient client = HttpClient.newBuilder().build()) {
            String nm = URLEncoder.encode("my test group", StandardCharsets.UTF_8);
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/group/v1/list?nm="+nm))
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .GET()
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println(json.getString("result"));
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":[
        {
            "idx":1,
            "nm":"쿠팡 전자제품",
            "memo":"10만원 ~ 50만원 제품",
            "linkCnt":112,
            "blockOverseasSticsYn":"N",
            "notfSubscYn":"N",
            "kakaoNotifyYn":"N",
            "pushNotifyYn":"N",
            "mailNotifyYn":"N",
            "clksIpFilteringYn":"N",
            "regYmdt":"2019-10-20 02:30:00",
            "modYmdt":"2019-10-20 02:30:00"
        },
        {
            "idx":2,
            "nm":"쿠팡 전자제품 (100만원 이상)",
            "memo":"100만원 이상 제품",
            "linkCnt":68,
            "blockOverseasSticsYn":"N",
            "notfSubscYn":"Y",
            "kakaoNotifyYn":"N",
            "pushNotifyYn":"Y",
            "mailNotifyYn":"N",
            "clksIpFilteringYn":"Y",
            "regYmdt":"2019-10-21 15:30:20",
            "modYmdt":"2019-10-22 11:20:50"
        }
    ]
}
Response:
필드설명유형
code응답 코드 (0:성공)int
message응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨.string
result 그룹 목록:
필드필드 설명설명유형
idx그룹ID-int
nm이름-string
memo메모-string
linkCnt링크 수그룹에 연결된 링크 수int
blockOverseasSticsYn해외통계 차단Y:사용함, N:사용 안함Y or N
notfSubscYn푸시구독Y:사용함, N:사용 안함Y or N
kakaoNotifyYn클릭 수 카톡 알림Y:사용함, N:사용 안함Y or N
pushNotifyYn클릭 수 푸시 알림Y:사용함, N:사용 안함Y or N
mailNotifyYn클릭 수 메일 알림Y:사용함, N:사용 안함Y or N
clksIpFilteringYn클릭 수 IP 필터링Y:사용함, N:사용 안함Y or N
regYmdt생성 날짜그룹이 생성된 날짜Date
modYmdt수정 날짜그룹이 수정된 날짜Date
array

Validasi tautan dengan tanggal kedaluwarsa, kata sandi, dan klik maksimum yang diizinkan

API ini tersedia pada paket Premium.

Ketika Anda membatasi akses ke sebuah tautan, Anda menetapkan tanggal kedaluwarsa, kata sandi, dan jumlah maksimum klik yang diizinkan.
Jika pengguna mengklik tautan yang dibuat oleh Vivoldi, tidak masalah, tetapi jika mereka langsung menuju ke URL yang panjang pada peramban mereka, tidak ada cara untuk memvalidasinya.
Vivoldi menyediakan SDK JavaScript terpisah untuk mengatasi masalah ini.

Ketika Anda menambahkan SDK ke halaman dengan tautan yang panjang, SDK akan mengambil informasi tautan dan memeriksa tanggal kedaluwarsa, kata sandi, dan jumlah maksimum klik yang diizinkan.
Alihkan kembali ke tautan pendek Vivoldi atau blokir akses.

Tambahkan skrip yang disediakan oleh Vivoldi ke halaman acara atau promosi Anda di antara ... dan dengan mudah memvalidasi hanya dengan satu baris kode.

Tambahkan skrip Vivoldi ke halaman Anda seperti yang ditunjukkan di bawah ini:

<html>
<head>
<title>샘플 페이지</title>
<script src="https://opencdn.vivoldi.com/js/v1/link.validate.min.js?v=202401191" type="text/javascript"></script>
<script>
const linkId = 'xY5h';   // 생성한 링크ID
const domain = 'https://vvd.bz';   // 링크 도메인 (vvd.bz 또는 vvd.im)
const apiKey = 'oc3w9m4ytso9mv5e8yse9XXXXXXXXXX';   // 귀하의 API Key
vvdLinkValidate(linkId, domain, apiKey);   // 비볼디에서 제공하는 SDK의 함수 호출
</script>
</head>

<body>
.
.
.
</body>
</html>
Request:
Get /api/validate/v1/link HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
Request 항목 설명:
필드필드 설명설명필수유형
linkId링크 ID 유효기간, 비밀번호, 최대 클릭 허용 수가 설정된 링크의 ID string
domain도메인 생성된 링크의 도메인 string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnValidate" type="button">Get validate</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnValidate").on('click', function(evt){
		evt.preventDefault();

		$.ajax({
			type: 'GET',
			url: 'https://vivoldi.com/api/validate/v1/link?linkId=4Rug&domain=https://vvd.bz',
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				console.log(res.result);
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$linkId = "4Rug";
$domain = "https://vvd.bz";
$url = "https://vivoldi.com/api/validate/v1/link?linkId=$linkId&domain=$domain";

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class LinkValidate {
	public static void main(String[] args) {
		try (HttpClient client = HttpClient.newBuilder().build()) {
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/validate/v1/link?linkId=4Rug&domain=https://vvd.bz"))
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .GET()
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println(json.getString("result"));
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result": {
        "linkId": "xY5h",
        "domain": "https://vvd.bz",
        "expireUseYn": "N",
        "expireYn": "N",
        "expireUrl": "https://",
        "acesMaxUseYn": "Y",
        "acesMaxYn": "Y",
        "acesMaxCnt": 1000,
        "acesCnt": 1,
        "pernCnt": 1,
        "agentKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "url": "https://vvd.bz/xY5h",
        "pwdUseYn": "Y",
        "pwdConfirmYn: "Y"
    }
}
Response 항목 설명:
필드설명유형
code응답 코드 (0:성공)int
message응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨.string
result
필드필드 설명설명유형
linkId링크ID-string
domain도메인-string
expireUseYn유효기간 설정여부 Y:유효기간 설정됨, N:유효기간이 설정되지 않음.
링크 그룹에 유효기간이 설정되어 있을 경우 링크의 유효기간은 무시됩니다.
Y or N
expireYn유효기간 만료여부Y:유효기간 만료됨, N:유효기간이 만료되지 않음Y or N
expireUrl유효기간 만료URL 유효기간이 만료될 경우 이동될 URL
링크 그룹에 유효기간 만료URL이 설정된 경우 링크의 만료URL은 무시됩니다.
string
acesMaxUseYn최대 클릭 허용 수 설정 여부 Y:최대 클릭 허용 수가 설정됨, N:최대 클릭 허용 수가 설정되지 않음.
링크 그룹에 최대 클릭 허용 수가 설정된 경우 링크의 허용 수 설정는 무시됩니다.
Y or N
acesMaxYn최대 클릭 허용 수 초과여부Y:최대 클릭 허용 수 초과됨, N:최대 클릭 허용 수 초과안됨Y or N
acesMaxCnt최대 클릭 허용 수설정된 최대 클릭 허용 수int
acesCnt링크 클릭 수현재까지 클릭된 수int
pernCnt링크 사람 수클릭한 사람 수int
agentKey사용자 키 값이 존재할 경우 비볼디의 짧은 링크를 클릭한 상태입니다.
값이 없을 경우 브라우저에서 긴 URL로 바로 접속한 경우입니다.
값이 존재할 경우 3시간 후 자동으로 값이 초기화됩니다.
string
url단축URL비볼디의 짧은 링크string
pwdUseYn비밀번호 설정여부 Y: 비밀번호가 설정됨, N:비밀번호가 설정되지 않음
링크 그룹에 비밀번호가 설정된 경우 링크의 비밀번호는 무시됩니다.
Y or N
pwdConfirmYn비밀번호 인증 완료여부 Y: 사용자가 단축URL에 접속한 후 비밀번호를 입력하고 인증에 성공함.
N:브라우저에서 긴 URL로 접속하였거나 비밀번호 인증이 완료되지 않은 상태.
비밀번호 인증이 완료된 후 3시간이 경과하면 값이 N으로 처리되므로 다시 인증을 해야 합니다.
Y or N
object

Buat kupon

API ini tersedia mulai dari paket Personal.

Membuat kupon diskon. Jika Anda ingin membuat beberapa kupon sekaligus, buatlah di dasbor.
Anda tidak dapat mengunggah gambar kupon menggunakan API.
Dalam hal ini, Anda dapat mengunggah gambar kupon saat Anda membuat grup kupon di dasbor dan menentukan grup saat Anda membuat kupon.
Jika Anda menentukan grup kupon saat Anda membuat kupon, maka beberapa pengaturan akan diabaikan dan pengaturan dalam grup kupon akan diterapkan.

Request:
Post /api/coupon/v1/create HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
cpnNo Nomor kupon 8~16 digit yang terdiri dari huruf kapital dan angka. Karakter khusus tidak diperbolehkan.
Jika nilai ini kosong, nomor kupon akan dibuat otomatis oleh sistem.
string
grpIdx Grup kupon digunakan untuk mengelola kategori kupon. Jika pengaturan grup dan pengaturan kupon bertabrakan, pengaturan kupon akan diabaikan.
Anda bisa melihat grup IDX pada halaman grup kupon di dashboard.
Nilai default: 0
int
tmplIdx Template kupon digunakan untuk mendeskripsikan kegunaan kupon, cara pakai, dan ketentuan lainnya.
Template IDX dapat ditemukan di halaman template kupon pada dashboard.
Nilai default: 0
int
nm Nama kupon akan ditampilkan di halaman kupon. string
discTypeIdx Tentukan jenis diskon (persen atau nominal) untuk kupon.
457: Diskon persen (%), 458: Diskon nominal.
Diskon persen: digunakan untuk diskon dalam bentuk persen.
Diskon nominal: digunakan untuk diskon dalam jumlah tertentu.
int
disc Masukkan nilai antara 1% dan 100% jika diskon berupa persen (457).
Masukkan jumlah diskon jika tipenya nominal (458).
double
discCurrency Anda dapat memilih satuan mata uang jika menggunakan diskon nominal (458).
KRW: won Korea, USD: dolar AS, JPY: yen Jepang, EUR: euro.
Nilai default: KRW
string
strtYmd Tentukan tanggal mulai masa berlaku kupon.
Masukkan 10 digit dengan format yyyy-mm-dd.
Contoh: 2024-10-01
date
endYmd Tentukan tanggal berakhirnya masa berlaku kupon.
Masukkan 10 digit dengan format yyyy-mm-dd.
Contoh: 2024-12-31
date
onsiteYn Jika nilai ini Y, halaman kupon akan menampilkan tombol untuk menukarkan kupon di tempat.
Pengguna menunjukkan kupon ke staf toko untuk ditukarkan.
Fitur ini berguna untuk toko fisik.
Nilai default: N
Y or N
onsitePwd Jika Anda mengatur kata sandi, staf toko harus memasukkannya saat memproses penukaran kupon.
Pengguna tidak bisa menukarkan kupon sendiri.
string
memo Dapat digunakan untuk keperluan internal dalam pengelolaan kupon.
Catatan ini tidak terlihat oleh pengguna.
string
url Setelah Anda memasukkan URL, halaman kupon akan menampilkan tombol “Tukar kupon” yang akan mengarahkan ke URL tersebut.
Jika gambar kupon diunggah, mengklik gambar juga akan membuka URL itu.
string
useLimit Tentukan batas maksimum penukaran kupon per orang.
Pada penggunaan REST API Vivoldi, jumlah penukaran harus antara 2 hingga 5 dan memerlukan user ID.
Saat mengelola manual melalui dashboard, hanya bisa memilih “Tidak terbatas” atau “1 kali”.
Jika memilih “Tidak terbatas”, siapa pun dapat menukarkan kupon tanpa batas.
0: Tidak terbatas, 1: 1 kali, 2: 2 kali, 3: 3 kali, 4: 4 kali, 5: 5 kali
int
color Tentukan warna teks kupon pada halaman kupon.
Harus dimasukkan dalam format HEX hingga 9 digit (termasuk transparansi).
Nilai default: #4F4F4FFF
string
background Atur warna latar belakang kupon pada halaman kupon.
Harus dalam format HEX hingga 9 digit (termasuk transparansi).
Nilai default: #FFFFFFFF
string
userId Digunakan untuk mengelola siapa yang menerbitkan dan menukarkan kupon.
Jika batas penukaran per orang antara 2-5, user ID wajib diisi.
Biasanya, masukkan ID login anggota yang terdaftar di situs Anda.
string
userNm Jika sudah tahu siapa yang akan menerima kupon, masukkan nama pengguna di sini.
Ini digunakan untuk mengelola penerbitan dan penukaran kupon.
string
userPhnno Masukkan nomor kontak pengguna yang akan menukarkan kupon. string
userEml Masukkan email pengguna yang akan menukarkan kupon. string
userEtc1 Masukkan informasi tambahan pengguna untuk keperluan administrasi internal. string
userEtc2 Masukkan informasi tambahan pengguna untuk keperluan administrasi internal. string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnCreateCoupon" type="button">Create Coupon</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnCreateCoupon").on('click', function(evt){
		evt.preventDefault();
		const data = JSON.stringify({
			'cpnNo':'',  // auto create
			'grpIdx':271,
			'tmplIdx':0,
			'nm':'5,000원 할인 쿠폰',
			'discTypeIdx':458,
			'disc':5000,
			'strtYmd':'2024-10-01',
			'endYmd':'2025-12-31',
			'memo':'신규 회원가입, Address:211.111.222.33',
			'url':'https://bestshop.com/product/bags/42316',
			'useLimit':1,
			'userId':'att78z',
			'userNm':'홍길동',
			'userPhnno':'010-1111-2345',
			'userEml':'test@gmail.com',
			'userEtc1':'VIP 회원'
		});
		$.ajax({
			type: 'POST',
			url: 'https://vivoldi.com/api/coupon/v1/create',
			data: data,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				alert('Coupon number: ' + res.result);
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$url = "https://vivoldi.com/api/coupon/v1/create";
$params = array (
	"cpnNo" => "",  // auto create
	"grpIdx" => 271,
	"tmplIdx" => 0,
	"nm" => "5,000원 할인 쿠폰",
	"discTypeIdx" => 458,
	"disc" => 5000,
	"strtYmd" => "2024-10-01",
	"endYmd" => "2025-12-31",
	"memo" => "신규 회원가입, Address:211.111.222.33",
	"url" => "https://bestshop.com/product/bags/42316",
	"useLimit" => 1,
	"userId" => "att78z",
	"userNm" => "홍길동",
	"userPhnno" => "010-1111-2345",
	"userEml" => "test@gmail.com",
	"userEtc1" => "VIP 회원"
);
$body = json_encode($params);

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX",
	"Content-Type: application/json"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class CreateCoupon {
    public static void main(String[] args) {
        try (HttpClient client = HttpClient.newBuilder().build()) {
            JSONObject params = new JSONObject();
            params.put("cpnNo", "");  // auto create
			params.put("grpIdx", 271);
			params.put("tmplIdx", 0);
			params.put("nm", "5,000원 할인 쿠폰");
			params.put("discTypeIdx", 458);
			params.put("disc", 5000);
			params.put("strtYmd", "2024-10-01");
			params.put("endYmd", "2025-12-31");
			params.put("memo", "신규 회원가입, Address:211.111.222.33");
			params.put("url", "https://bestshop.com/product/bags/42316");
			params.put("useLimit", 1);
			params.put("userId", "att78z");
			params.put("userNm", "홍길동");
			params.put("userPhnno", "010-1111-2345");
			params.put("userEml", "test@gmail.com");
			params.put("userEtc1", "VIP 회원");

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/coupon/v1/create"))
                .header("Content-Type", "application/json")
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .POST(HttpRequest.BodyPublishers.ofString(params.toString()))
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("Coupon number: " + json.getString("result"));
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
    }
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":"ZJLF0399WQBEQZJM"
}
Response:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string
resultNilai respons (Nomor kupon)string

Edit kupon

API ini tersedia mulai dari paket Personal.

Mengubah informasi dalam kupon yang dibuat.
Saat Anda menetapkan grup ke kupon, beberapa pengaturan diabaikan dan pengaturan dalam grup kupon diterapkan.
Untuk kupon yang telah ditukarkan, Anda hanya dapat mengedit "Catatan" tetapi tidak dapat mengedit informasi lainnya.

Request:
Put /api/coupon/v1/edit HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
cpnNo Nomor kupon yang ingin Anda perbarui. Masukkan hanya nomor kupon, tanpa karakter "-". string
grpIdx Grup kupon digunakan untuk mengelola pengkategorian kupon. Jika ada pengaturan grup dan pengaturan kupon bersamaan, pengaturan kupon akan diabaikan.
Anda dapat menemukan grup IDX di halaman Grup Kupon di dashboard.
Nilai default: 0
int
tmplIdx Template kupon digunakan untuk memberikan deskripsi, petunjuk penggunaan, dan peringatan kepada pengguna.
Anda dapat menemukan template IDX di halaman Template Kupon di dashboard.
Nilai default: 0
int
nm Nama kupon akan ditampilkan di halaman kupon. string
discTypeIdx Mengatur tipe diskon untuk kupon (persentase atau nominal).
457: Diskon persentase (%), 458: Diskon nominal
Diskon persentase: digunakan untuk memberikan diskon berdasarkan persentase.
Diskon nominal: digunakan untuk memberikan diskon dengan jumlah tetap.
int
disc Jika tipe diskon adalah persentase (457), masukkan nilai antara 1% hingga 100%.
Jika tipe diskon adalah nominal (458), masukkan jumlah diskonnya.
double
discCurrency Anda dapat mengatur satuan mata uang jika tipe diskon adalah nominal (458).
KRW: Won Korea, USD: Dolar AS, JPY: Yen Jepang, EUR: Euro.
Nilai default: KRW
string
strtYmd Atur tanggal mulai masa berlaku kupon.
Nilai 10 digit dengan format yyyy-mm-dd.
Contoh: 2024-10-01
date
endYmd Atur tanggal kadaluwarsa masa berlaku kupon.
Nilai 10 digit dengan format yyyy-mm-dd.
Contoh: 2024-12-31
date
onsiteYn Jika nilai ini Y, tombol penukaran kupon akan ditampilkan di halaman kupon.
Pengguna menunjukkan kupon ke staf toko, lalu staf akan menukarkannya. Fitur ini berguna jika Anda memiliki toko fisik.
Y or N
onsitePwd Jika Anda mengatur kata sandi, staf toko harus memasukkannya saat menukarkan kupon.
Pengguna tidak dapat menukarkan kupon secara mandiri.
string
memo Digunakan untuk manajemen internal kupon.
Catatan tidak terlihat oleh pengguna.
string
url Jika Anda memasukkan URL, tombol "Tukar kupon" akan muncul di halaman kupon dan akan mengarahkan ke URL tersebut saat diklik.
Jika gambar kupon diunggah, mengklik gambar juga akan mengarahkan ke URL.
string
useLimit Atur jumlah maksimum penukaran kupon per orang.
Saat menggunakan REST API Vivoldi untuk memproses penukaran, nilai antara 2 dan 5 wajib diisi.
Dalam hal ini, user ID wajib diisi.
Saat mengelola penukaran manual melalui dashboard, Anda dapat memilih "Tanpa batas" atau "1 kali".
Jika memilih "Tanpa batas", siapa pun dapat menukarkan kupon tanpa batas penggunaan.
0: Tanpa batas, 1: 1 kali, 2: 2 kali, 3: 3 kali, 4: 4 kali, 5: 5 kali
int
color Mengatur warna teks kupon di halaman kupon.
Harus diisi dalam format HEX hingga 9 digit, termasuk transparansi.
Nilai default: #4F4F4FFF
string
background Mengatur warna latar belakang kupon di halaman kupon.
Harus diisi dalam format HEX hingga 9 digit, termasuk transparansi.
Nilai default: #FFFFFFFF
string
userId Digunakan untuk mengelola siapa yang menerima dan siapa yang menukarkan kupon.
Jika batas maksimal penukaran per orang adalah 2~5, user ID wajib diisi.
Biasanya, masukkan ID login anggota yang terdaftar di website Anda.
string
userNm Jika Anda sudah mengetahui siapa yang akan menerima kupon, masukkan nama pengguna yang akan menggunakannya.
Ini diperlukan untuk mengelola penerbitan dan penukaran kupon.
string
userPhnno Atur informasi kontak pengguna yang akan menukarkan kupon. string
userEml Atur alamat email pengguna yang akan menukarkan kupon. string
userEtc1 Atur informasi tambahan tentang pengguna untuk keperluan administrasi internal. string
userEtc2 Atur informasi tambahan tentang pengguna untuk keperluan administrasi internal. string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnEditCoupon" type="button">Edit Coupon</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnEditCoupon").on('click', function(evt){
		evt.preventDefault();
		const data = JSON.stringify({
			'cpnNo':'ZJLF0399WQBEQZJM',
			'nm':'40% 할인 쿠폰',
			'discTypeIdx':457,
			'disc':40
		});
		$.ajax({
			type: 'PUT',
			url: 'https://vivoldi.com/api/coupon/v1/edit',
			data: data,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				alert('success!');
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$url = "https://vivoldi.com/api/coupon/v1/edit";
$params = array (
	"cpnNo" => "ZJLF0399WQBEQZJM",
	"nm" => "40% 할인 쿠폰",
	"discTypeIdx" => 457,
	"disc" => 40
);
$body = json_encode($params);

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX",
	"Content-Type: application/json"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class EditCoupon {
    public static void main(String[] args) {
        try (HttpClient client = HttpClient.newBuilder().build()) {
            JSONObject params = new JSONObject();
            params.put("cpnNo", "ZJLF0399WQBEQZJM");
			params.put("nm", "40% 할인 쿠폰");
			params.put("discTypeIdx", 457);
			params.put("disc", 40);

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/coupon/v1/edit"))
                .header("Content-Type", "application/json")
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .PUT(HttpRequest.BodyPublishers.ofString(params.toString()))
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("Success!");
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
    }
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":null
}
Response:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string

Hapus kupon

API ini tersedia mulai dari paket Personal.

Menghapus kupon yang dibuat.
Untuk menghapus beberapa kupon sekaligus, gunakan dasbor.

Request:
Delete /api/coupon/v1/remove HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: -
Request:
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
cpnNoCoupon number Nomor kupon yang akan dihapus. string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnDeleteCoupon" type="button">Delete Coupon</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnDeleteCoupon").on('click', function(evt){
		evt.preventDefault();

		$.ajax({
			type: 'DELETE',
			url: 'https://vivoldi.com/api/coupon/v1/remove?cpnNo=ZJLF0399WQBEQZJM',
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				alert('Success!');
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$cpnNo = "ZJLF0399WQBEQZJM";
$url = "https://vivoldi.com/api/coupon/v1/remove?cpnNo=$cpnNo";

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class DeleteCoupon {
	public static void main(String[] args) {
		try (HttpClient client = HttpClient.newBuilder().build()) {
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/link/v1/remove?cpnNo=ZJLF0399WQBEQZJM"))
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .DELETE()
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("Success!");
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":""
}
Response:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string

Validasi kupon

API ini tersedia mulai dari paket Personal.

Digunakan untuk memeriksa dan memvalidasi apakah kupon tersebut valid sebelum memproses "Tukarkan kupon".
Verifikasi validasi kupon seperti yang ditunjukkan di bawah ini.
  • Validasi tanggal kedaluwarsa kupon. (tanggal mulai dan tanggal kedaluwarsa)
  • Validasi jumlah maksimum kupon per orang.
  • Validasi penukaran kupon.
Request:
Get /api/coupon/v1/validate HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request 항목 설명:
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
cpnNoCoupon number Nomor kupon yang akan divalidasi.
Jika validasi gagal, periksa pesan di respons.
string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnValidate" type="button">Get validate</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnValidate").on('click', function(evt){
		evt.preventDefault();

		$.ajax({
			type: 'GET',
			url: 'https://vivoldi.com/api/coupon/v1/validate?cpnNo=ZJLF0399WQBEQZJM',
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				console.log('사용 가능한 쿠폰입니다.');
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$cpnNo = "ZJLF0399WQBEQZJM";
$url = "https://vivoldi.com/api/coupon/v1/validate?cpnNo=$cpnNo";

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     echo "사용 가능한 쿠폰입니다.";
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class ValidateCoupon {
	public static void main(String[] args) {
		try (HttpClient client = HttpClient.newBuilder().build()) {
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/coupon/v1/validate?cpnNo=ZJLF0399WQBEQZJM"))
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .GET()
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("사용 가능한 쿠폰입니다.");
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result": null
}
Response 항목 설명:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string

Gunakan kupon

API ini tersedia mulai dari paket Personal.

Meskipun Anda dapat mengelola proses "menukarkan kupon" secara manual di daftar kupon di dasbor Anda, API ini memungkinkan Anda untuk mengotomatiskannya dengan memanggilnya saat pengguna menukarkan kupon di situs web Anda.

Request:
Put /api/coupon/v1/use HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
BidangDeskripsi LapanganDeskripsiDiperlukanJenis
cpnNoCoupon number Nomor kupon “ditukarkan” yang akan diproses.
Masukkan hanya nomor kupon tanpa tanda “-”.
string
onsitePwdOn-site coupon usage password Jika telah diatur kata sandi untuk penggunaan kupon di toko, masukkan kata sandi yang telah ditetapkan.
Jika kata sandi salah, Anda tidak dapat menggunakan kupon tersebut.
string
userIdUser ID Digunakan untuk mengelola siapa yang mengeluarkan dan menukarkan kupon.
Jika nilai maksimum penukaran per orang adalah antara 2 hingga 5, user ID harus diisi.
Biasanya, masukkan ID login anggota yang terdaftar di situs Anda.
string
memoNotes Anda dapat memasukkan catatan untuk mengelola penukaran kupon.
Masukkan alamat IP pengguna, halaman dan layanan tempat kupon ditukarkan, serta informasi lainnya.
Jika jumlah maksimum penukaran per orang tidak terbatas, Anda tidak tahu siapa yang menukarkan kupon, sehingga dapat mengelola berdasarkan nama pengguna atau catatan.
string
Examples:
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<script src="https://code.jquery.com/jquery-3.4.1.min.js" crossorigin="anonymous"></script>
</head>

<body>

<form id="exampleForm">
	<button id="btnUseCoupon" type="button">Use Coupon</button>
</form>

<script type="text/javascript">
$(function(){
	$("#btnUseCoupon").on('click', function(evt){
		evt.preventDefault();
		const data = JSON.stringify({
			'cpnNo':'ZJLF0399WQBEQZJM',
			'userId':'x77hu',
			'memo':'IP Address: 210.123.111.222, Request Page: example.com/shop/bags/p112233'
		});
		$.ajax({
			type: 'PUT',
			url: 'https://vivoldi.com/api/coupon/v1/use',
			data: data,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			contentType: 'application/json; charset=utf-8',
			dataType: 'json',
			timeout: 5000
		}).done(function(res){
			if (res.code === 0) {
				alert('success!');
			} else {
				alert('code: ' + res.code + ', message: ' + res.message);
			}
		}).fail(function(xhr, textStatus, e){
			alert('error: ' + e);
		});
	});
});
</script>

</body>
</html>
<?php
$url = "https://vivoldi.com/api/coupon/v1/use";
$params = array (
	"cpnNo" => "ZJLF0399WQBEQZJM",
	"userId" => "x77hu",
	"memo" => "IP Address: 210.123.111.222, Request Page: example.com/shop/bags/p112233"
);
$body = json_encode($params);

$headers = array(
	"Authorization: APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX",
	"Content-Type: application/json"
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);

$result = curl_exec($ch);

if ($result === FALSE) {
     echo "Error sending: " . curl_error($ch);
} else {
     print_r($result);
}
curl_close($ch);
?>
package com.example;

import org.json.JSONObject;
import org.springframework.http.HttpStatus;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class UseCoupon {
    public static void main(String[] args) {
        try (HttpClient client = HttpClient.newBuilder().build()) {
            JSONObject params = new JSONObject();
            params.put("cpnNo", "ZJLF0399WQBEQZJM");
			params.put("userId", "x77hu");
			params.put("memo", "IP Address: 210.123.111.222, Request Page: example.com/shop/bags/p112233");

            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create("https://vivoldi.com/api/coupon/v1/use"))
                .header("Content-Type", "application/json")
                .header("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
                .PUT(HttpRequest.BodyPublishers.ofString(params.toString()))
                .build();

            HttpResponse<String> response;
            try {
                response = client.send(request, HttpResponse.BodyHandlers.ofString());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

            if (response != null) {
                if (response.statusCode() == HttpStatus.OK.value()) {
                    String jsonString = response.body();
                    if (jsonString != null && !jsonString.isEmpty()) {
                        JSONObject json = new JSONObject(jsonString);
                        if (json.getInt("code") == 0) {
                            System.out.println("Success!");
                        } else {
                            System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
                        }
                    }
                }
            }
        }
    }
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":null
}
Response:
BidangDeskripsiJenis
codeKode respons (0: Sukses)int
messagePesan respons, atau pesan terkait jika kode respons bukan nol.string

Mengirim pesan push

API ini tidak bergantung pada layanan Pemendek URL Vivoldi dan ditujukan untuk siapa saja yang menjalankan situs web.

Untuk mengirim pesan push ke pengguna yang mengunjungi situs web Anda, pengguna harus menyetujui "izin notifikasi" di browser web mereka.
Jika mereka menolak izin notifikasi, Anda tidak akan dapat mengirim pesan push.

Setelah Anda menginstal JavaScript SDK yang disediakan oleh Vivoldi di situs web Anda, browser web akan menampilkan jendela pop-up untuk "Izin Pemberitahuan" ketika pengguna mengunjungi situs web Anda.
Jika pengguna menyetujui izin tersebut, data notifikasi akan dicantumkan di halaman " Push Messages -> Send website push" pada dashboard.
Sebagai contoh, jika 100 pengguna telah menyetujui izin notifikasi di situs web Anda, Anda akan melihat 100 data dalam daftar.
Ketika Anda mengirim pesan push dari dasbor, pesan tersebut akan dikirim ke semua pengguna yang ditampilkan dalam daftar.

Siapa pun dapat menginstal JavaScript SDK yang disediakan oleh Vivoldi untuk mengumpulkan data pengguna.
Namun, Anda harus memiliki uang di akun Anda untuk mengirim pesan push.
Biaya untuk mengirim pesan push adalah 10 KRW per pesan, atau Anda bisa mendaftar untuk berlangganan bulanan untuk mengirim pesan dalam jumlah tak terbatas.

Menginstal JavaScript SDK semudah menambahkannya di antara < head>...</head>.

<html>
<head>
<title>example page</title>
<script src="https://opencdn.vivoldi.com/js/webpush.min.js?v=202502051" type="text/javascript"></script>
<script>
const apiKey = 'oc3w9m4ytso9mv5e8yse9XXXXXXXXXX';   // your api key
const publicKey = 'XXXXXYTRlpG8mXXXXXiuBZ6BtjyOfgPsDArFYWF2PxZbY4egmDNias1gEfN_5wftScr39K8BbcjXXXXX';   // "푸시 메시지 -> 도메인 관리" 페이지에서 등록한 도메인의 Public Key
const params = {apiKey:apiKey, publicKey:publicKey};
webpush.register(params);   // 알림 권한 팝업 창 띄우기 (이미 권한을 허용하였다면 팝업이 표시되지 않습니다)
</script>
</head>

<body>
.
.
.
</body>
</html>

Kunci API dapat dibuat pada halaman "API Pengembang" di dasbor Anda, dan publicKey dapat ditemukan dalam daftar setelah Anda mendaftarkan domain pada halaman " Pesan Push -> Manajemen Domain".

Setelah semuanya siap, hal terakhir yang perlu Anda lakukan adalah membuat berkas sw. min.js baru dan mengunggahnya ke root situs web Anda.
Sebagai contoh: https://example.com/sw.min.js

Ketika mengakses jalur di atas, skrip harus ditampilkan di peramban web agar notifikasi dapat berfungsi dengan baik.
Salin dan tempelkan kode di bawah ini ke dalam file sw.min.js yang baru Anda buat.

sw.min.js:
'use strict';const a0_0x5374e1=a0_0xe038;(function(_0x1227c0,_0x51a60b){const _0x31ab77=a0_0xe038,_0x20d84d=_0x1227c0();while(!![]){try{const _0x12de05=parseInt(_0x31ab77(0x189))/0x1+-parseInt(_0x31ab77(0x188))/0x2+-parseInt(_0x31ab77(0x175))/0x3+parseInt(_0x31ab77(0x196))/0x4+parseInt(_0x31ab77(0x191))/0x5*(parseInt(_0x31ab77(0x179))/0x6)+parseInt(_0x31ab77(0x190))/0x7*(-parseInt(_0x31ab77(0x18a))/0x8)+parseInt(_0x31ab77(0x181))/0x9*(parseInt(_0x31ab77(0x173))/0xa);if(_0x12de05===_0x51a60b)break;else _0x20d84d['push'](_0x20d84d['shift']());}catch(_0x40c5f5){_0x20d84d['push'](_0x20d84d['shift']());}}}(a0_0x3c7d,0xc9d27));function a0_0xe038(_0x596680,_0x1be660){const _0x3c7dc3=a0_0x3c7d();return a0_0xe038=function(_0xe03880,_0x22c065){_0xe03880=_0xe03880-0x170;let _0x16ce5f=_0x3c7dc3[_0xe03880];return _0x16ce5f;},a0_0xe038(_0x596680,_0x1be660);}function a0_0x3c7d(){const _0x45d9ad=['waitUntil','notification','20673aXYLrA','navigator','title','focus','icon','toLowerCase','image','168378lbyyZD','193689SqVukM','41896sLUVSk','macintosh','close','registration','userAgent','body','1253fKQvUq','2054765fkWElD','install','includes','openWindow','badge','4620004XrYmFj','notificationclick','ko-KR','url','showNotification','parse','바로가기','window','platform','mac','actions','1490bVkBER','action','1993722LznGRH','navigate','button','activate','12Yewkpl','push','matchAll','data','then','addEventListener'];a0_0x3c7d=function(){return _0x45d9ad;};return a0_0x3c7d();}self['addEventListener'](a0_0x5374e1(0x192),_0x220cef=>{self['skipWaiting']();}),self[a0_0x5374e1(0x17e)](a0_0x5374e1(0x178),_0x4e57ea=>{const _0x4e29f9=a0_0x5374e1;_0x4e57ea[_0x4e29f9(0x17f)](clients['claim']());}),self[a0_0x5374e1(0x17e)](a0_0x5374e1(0x17a),function(_0x5b8772){const _0x578b75=a0_0x5374e1,_0x6a0810=JSON[_0x578b75(0x19b)](_0x5b8772[_0x578b75(0x17c)]['text']()),_0x41c647=navigator['language'],_0x3709b8=_0x41c647==='ko'||_0x41c647===_0x578b75(0x198),_0x398015=self[_0x578b75(0x182)]['platform']['toLowerCase']()[_0x578b75(0x193)](_0x578b75(0x171)),_0x570dee=self[_0x578b75(0x182)]['userAgent']['toLowerCase']()[_0x578b75(0x193)](_0x578b75(0x18b)),_0x417e2c={'tag':'renotify','renotify':!![],'body':_0x6a0810[_0x578b75(0x18f)],'icon':_0x6a0810[_0x578b75(0x185)],'badge':_0x6a0810[_0x578b75(0x195)],'requireInteraction':!![],'vibrate':[0x12c,0x64,0x190,0xc8,0x1f4],'data':_0x6a0810,'actions':[{'action':'go','type':_0x578b75(0x177),'title':_0x3709b8?_0x578b75(0x19c):'GO'},{'action':_0x578b75(0x18c),'type':'button','title':_0x3709b8?'닫기':'CLOSE'}]};_0x6a0810[_0x578b75(0x187)]&&(_0x417e2c[_0x578b75(0x187)]=_0x6a0810[_0x578b75(0x187)]),(_0x398015||_0x570dee)&&delete _0x417e2c[_0x578b75(0x172)],_0x5b8772['waitUntil'](self[_0x578b75(0x18d)][_0x578b75(0x19a)](_0x6a0810[_0x578b75(0x183)],_0x417e2c));}),self[a0_0x5374e1(0x17e)](a0_0x5374e1(0x197),function(_0x278188){const _0x1737d2=a0_0x5374e1;_0x278188['notification'][_0x1737d2(0x18c)]();const _0x381024=self['navigator'][_0x1737d2(0x170)][_0x1737d2(0x186)]()[_0x1737d2(0x193)]('mac'),_0x419533=self[_0x1737d2(0x182)][_0x1737d2(0x18e)][_0x1737d2(0x186)]()[_0x1737d2(0x193)](_0x1737d2(0x18b));if(_0x381024||_0x419533)_0x278188[_0x1737d2(0x17f)](clients[_0x1737d2(0x17b)]({'type':_0x1737d2(0x19d)})[_0x1737d2(0x17d)](_0x55a8eb=>{const _0x25611a=_0x1737d2;_0x55a8eb['length']>0x0?(_0x55a8eb[0x0][_0x25611a(0x176)](_0x278188[_0x25611a(0x180)][_0x25611a(0x17c)][_0x25611a(0x199)]),_0x55a8eb[0x0][_0x25611a(0x184)]()):clients[_0x25611a(0x194)](_0x278188[_0x25611a(0x180)]['data'][_0x25611a(0x199)]);}));else switch(_0x278188[_0x1737d2(0x174)]){case'go':_0x278188[_0x1737d2(0x17f)](clients[_0x1737d2(0x194)](_0x278188[_0x1737d2(0x180)][_0x1737d2(0x17c)][_0x1737d2(0x199)]));break;case _0x1737d2(0x18c):break;default:_0x278188['waitUntil'](clients[_0x1737d2(0x194)](_0x278188[_0x1737d2(0x180)][_0x1737d2(0x17c)][_0x1737d2(0x199)]));}});

Sekarang, ketika Anda mengakses situs web Anda, Anda akan melihat izin notifikasi.
Setelah Anda mengizinkan izin notifikasi, periksa apakah Anda melihat data notifikasi di halaman "Pengiriman Push Situs Web " pada dasbor Vivoldi Anda.