URL줄이기 개발자 API

개발자 API 소개

비볼디는 귀사의 플랫폼 또는 시스템을 위해 전용 REST API를 제공합니다.
REST API를 이용하면 비볼디 대시보드에서 링크를 만들지 않고도 귀하가 소유하고 있는 서버 또는 모바일 앱에서 자유롭게 링크를 만들 수 있습니다.

제공되는 REST API는 JavaScript, PHP, Java, Android, iOS 등 개발 언어와 운영체제에 상관없이 자유롭게 API를 호출할 수 있습니다.
API를 호출하기 전 반드시 API Key가 생성되어 있어야 하며 생성된 API Key는 타인에게 노출되지 않도록 관리가 필요합니다.

API Key 변경은 1달 마다 가능하며 API Key가 변경되어도 이미 생성된 링크에는 아무런 영향이 없습니다.
모든 API는 무료 요금제도 얼마든지 이용할 수 있고 비볼디에서 정한 Request 규격에 따르며, 요금제에 따라 API 처리와 응답 속도가 다릅니다.

API 호출 후 HTTP 403 오류가 발생하면, Header에 별도의 User-agent 값을 지정하세요.
비볼디는 일부 User-agent를 차단합니다.

단축url, url단축, 링크줄이기를 위한 개발자 REST API

API 호출 방법

Request:
Host: https://vivoldi.com/api HTTP/1.1
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
Authorization, Content-type을 Http Header에 추가한 후 API를 호출하면 됩니다.
Response:
{
    "code": 0,
    "message": "",
    "result": Object
}
code - 응답 코드로 0은 성공이며 이외 값은 실패 코드입니다.
message - 응답 메시지로 응답 코드가 0이 아닌 경우 오류 메시지가 리턴됩니다.
result - 응답 값으로 API 유형에 따라 문자 또는 JSON Object로 리턴됩니다.
REST API 개선 또는 수정이 필요할 경우 비볼디에 문의주세요.

링크 생성

1개의 단축 링크를 생성합니다. 만약, 대량의 링크를 만들고자 한다면 대시보드의 "대량 링크 만들기" 메뉴를 이용하세요.

Request:
Post /api/link/v1/create HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
Request:
필드필드 설명설명필수유형
url긴 URL생성된 짧은 링크를 클릭했을 때 이동될 긴 URLstring
domain도메인 링크 도메인, 값이 비어 있으면 자동으로 vvd.bz 도메인이 선택됩니다.
비볼디의 랜덤 도메인을 이용 중이거나 귀하가 소유한 도메인을 비볼디와 연동하였을 경우 해당 도메인을 설정하면 됩니다.
string
grpIdx그룹ID 그룹ID를 설정하면 해당 그룹에 링크가 생성됩니다.
그룹ID를 확인하려면 "그룹 목록" API를 호출하여 확인해야 합니다.
int
brandLinkId브랜드 링크ID 값을 지정하면 해당 ID로 링크가 생성됩니다.
(브랜드 링크가 설정된 경우 도메은 vvd.bz이 아닌 vvd.im 입니다)
값이 비어 있으면 링크ID는 자동으로 생성됩니다.
string
ttl링크 제목 값이 비어 있으면 자동으로 긴 링크의 웹페이지 제목으로 저장됩니다. string
memo메모 사용자에게 노출되지 않고 관리에 필요한 부가 정보를 설정할 수 있습니다. string
notfSubscYn푸시구독 링크 값이 Y일 경우 생성된 링크를 클릭하면 긴 링크로 이동되기 전 웹푸시 알림 팝업이 표시되고
사용자가 푸시알림에 허용할 경우 허용한 모든 사용자들에게 푸시 메시지를 전송할 수 있습니다.
알림 팝업에 동의하지 않거나 취소할 경우 즉시 원래의 긴 URL로 이동됩니다.
값을 입력하지 않으면 기본 값은 N 입니다.
푸시구독 링크에 대해 자세히 알아보시려면 웹푸시 기능 소개 페이지에서 살펴보세요.
Y or N
blockOverseasSticsYn해외통계 차단 값이 Y일 경우 한국 이외 국가에서 링크를 클릭할 경우 링크 접속은 가능하지만 클릭 수 통계를 저장하지 않습니다.
악성 봇 또는 검색 로봇으로 인해 클릭 수가 비정상적으로 많을 경우 값을 Y로 설정하세요.
Y or N
clksIpFilteringYn클릭 수 IP 필터링 값이 Y일 경우 24시간 동안 동일 IP에서 링크를 클릭할 때 링크 클릭 수가 계속 증가하지 않고 1로 고정됩니다.
자정(오전 12시)이 지나서 다시 링크를 클릭하면 클릭 수가 +1 됩니다.
클릭 수 IP 필터링 기능은 링크 생성 시에만 설정이 가능하며 이후 링크 수정으로 값을 변경할 수 없습니다.
이 기능은 퍼스널 요금제부터 이용할 수 있습니다.
Y or N
pushNotifyYn클릭 수 푸시 알림 값이 Y일 경우 "설정 -> 환경 설정" 페이지의 링크 설정에서 설정된 링크 클릭 수에 도달할 때 마다 비볼디 앱이 설치된 모바일 기기로 클릭 수 푸시 알림을 수신할 수 있습니다.
이 기능은 퍼스널 요금제부터 이용할 수 있습니다.
Y or N
mailNotifyYn클릭 수 메일 알림 값이 Y일 경우 "설정 -> 환경 설정" 페이지의 링크 설정에서 설정된 링크 클릭 수에 도달할 때 마다 비볼디에 가입된 이메일로 클릭 수 정보를 수신할 수 있습니다.
이 기능은 퍼스널 요금제부터 이용할 수 있습니다.
Y or N
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">
	url: <input type="text" id="url" name="url" value="https://google.com"/><br/>
	domain: <input type="text" id="domain" name="domain" value="https://vvd.bz"/><br/>
	<button id="btnCreateLink" type="button">Create Link</button>
</form>

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

		const form = $('#exampleForm')[0];
		const data = new FormData(form);

		$.ajax({
			type: 'POST',
			url: 'https://vivoldi.com/api/link/v1/create',
			data: data,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			processData: false,
			contentType: false,
			cache: false,
			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/v1/create";
$params = array (
	"url" => "https://www.facebook.com/vivoldi365",
	"domain" => "https://vvd.bz",
);

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

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

$result = curl_exec($ch);

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

import okhttp3.*;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;

public class CreateLink {
	public static void main(String[] args) {
		RequestBody requestBody = new FormBody.Builder()
			.add("url", "https://www.facebook.com/vivoldi365")
			.add("domain", "https://vvd.bz")
			.build()
		;

		Request request = new Request.Builder()
		   .url("https://vivoldi.com/api/link/v1/create")
		   .addHeader("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
		   .post(requestBody)
		   .build();

		OkHttpClient client = new OkHttpClient();
		try {
		   Response response = client.newCall(request).execute();
		   if (response.isSuccessful()) {
				ResponseBody body = response.body();
				if (body != null) {
					 String jsonText = body.string();
					 body.close();
					 JSONObject json = new JSONObject(jsonText);
					 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")));
					 }
				}
		   }
		} catch (IOException e) {
		   e.printStackTrace();
		}
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":"",
    "result":"https://vvd.bz/jH3d"
}
Response:
필드설명유형
code응답 코드 (0:성공)int
message응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨.string
result응답 값 (단축된 링크)string

링크 수정

생성한 짧은 링크를 수정합니다.

Request:
Post /api/link/v1/edit HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
Request:
필드필드 설명설명필수유형
linkId링크ID 생성된 짧은 링크의 ID
예:
짧은 링크의 주소가 "https://vvd.bz/fML"이면 링크ID는 fML 입니다.
string
domain도메인 짧은 링크 주소의 도메인.
예:
짧은 링크의 주소가 "https://vvd.bz/fML"이면 도메인은 https://vvd.bz 입니다.
중요: https:// 또는 http:// 값을 반드시 입력해야 합니다.
생성된 짧은 링크의 도메인이 아닌 다른 도메인으로 설정할 경우 오류가 발생합니다.
string
grpIdx그룹ID 생성된 링크의 그룹을 변경합니다.
그룹ID를 확인하려면 "그룹 목록" API를 호출하여 확인해야 합니다.
int
ttl링크 제목 값이 비어 있으면 링크 제목이 수정되지 않습니다.
string
memo메모 사용자에게 노출되지 않고 관리에 필요한 부가 정보를 설정할 수 있습니다.
값이 비어 있으면 메모가 수정되지 않습니다.
string
notfSubscYn푸시구독 링크 값이 Y일 경우 생성된 링크를 클릭하면 긴 링크로 이동되기 전 웹푸시 알림 팝업이 표시되고
사용자가 푸시알림에 허용할 경우 허용한 모든 사용자들에게 푸시 메시지를 전송할 수 있습니다.
알림 팝업에 동의하지 않거나 취소할 경우 즉시 원래의 긴 URL로 이동됩니다.
값을 입력하지 않으면 기본 값은 N 입니다.
푸시구독 링크에 대해 자세히 알아보시려면 여기를 클릭하세요.
Y or N
blockOverseasSticsYn해외통계 차단 값이 Y일 경우 한국 이외 국가에서 링크를 클릭할 경우 링크 접속은 가능하지만 클릭 수 통계를 저장하지 않습니다.
악성 봇 또는 검색 로봇으로 인해 클릭 수가 비정상적으로 많을 경우 값을 Y로 설정하세요.
Y or N
pushNotifyYn클릭 수 푸시 알림 값이 Y일 경우 "설정 -> 환경 설정" 페이지의 링크 설정에서 설정된 링크 클릭 수에 도달할 때 마다 비볼디 앱이 설치된 모바일 기기로 클릭 수 푸시 알림을 수신할 수 있습니다.
이 기능은 퍼스널 요금제부터 이용할 수 있습니다.
Y or N
mailNotifyYn클릭 수 메일 알림 값이 Y일 경우 "설정 -> 환경 설정" 페이지의 링크 설정에서 설정된 링크 클릭 수에 도달할 때 마다 비볼디에 가입된 이메일로 클릭 수 정보를 수신할 수 있습니다.
이 기능은 퍼스널 요금제부터 이용할 수 있습니다.
Y or N
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">
	linkId: <input type="text" id="linkId" name="linkId" value="4Rt3"/><br/>
	domain: <input type="text" id="domain" name="domain" value="https://vvd.bz"/><br/>
	domain: <input type="text" id="ttl" name="ttl" value="새로운 제목"/><br/>
	domain: <input type="text" id="memo" name="memo" value="새로운 메모"/><br/>
	<button id="btnUpdateLink" type="button">Update Link</button>
</form>

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

		const form = $('#exampleForm')[0];
		const data = new FormData(form);

		$.ajax({
			type: 'POST',
			url: 'https://vivoldi.com/api/link/v1/edit',
			data: data,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			processData: false,
			contentType: false,
			cache: false,
			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/v1/edit";
$params = array (
	"linkId" => "4Rt3",
	"domain" => "https://vvd.bz",
	"ttl" => "새로운 제목",
	"memo" => "새로운 메모"
);

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

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

$result = curl_exec($ch);

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

import okhttp3.*;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;

public class UpdateLink {
	public static void main(String[] args) {
		RequestBody requestBody = new FormBody.Builder()
			.add("linkId", "4Rt3")
			.add("domain", "https://vvd.bz")
			.add("ttl", "새로운 제목")
			.add("memo", "새로운 메모")
			.build()
		;

		Request request = new Request.Builder()
		   .url("https://vivoldi.com/api/link/v1/edit")
		   .addHeader("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
		   .post(requestBody)
		   .build();

		OkHttpClient client = new OkHttpClient();
		try {
		   Response response = client.newCall(request).execute();
		   if (response.isSuccessful()) {
				ResponseBody body = response.body();
				if (body != null) {
					 String jsonText = body.string();
					 body.close();
					 JSONObject json = new JSONObject(jsonText);
					 if (json.getInt("code") == 0) {
						  System.out.println("Success!");
					 } else {
						  System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
					 }
				}
		   }
		} catch (IOException e) {
		   e.printStackTrace();
		}
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":""
}
Response:
필드설명유형
code응답 코드 (0:성공)int
message응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨.string

링크 삭제

생성한 짧은 링크를 삭제합니다.

Request:
Post /api/link/v1/remove HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
Request:
필드필드 설명설명필수유형
linkId링크Id 생성된 짧은 링크의 ID
예:
짧은 링크의 주소가 "https://vvd.bz/fML"이면 링크ID는 fML 입니다.
string
domain도메인 짧은 링크 주소의 도메인.
예:
짧은 링크의 주소가 "https://vvd.bz/fML"이면 도메인은 https://vvd.bz 입니다.
중요: https:// 또는 http:// 값을 반드시 입력해야 합니다.
생성된 짧은 링크의 도메인이 아닌 다른 도메인으로 설정할 경우 오류가 발생합니다.
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">
	linkId: <input type="text" id="linkId" name="linkId" value="4Rt3"/><br/>
	domain: <input type="text" id="domain" name="domain" value="https://vvd.bz"/><br/>
	<button id="btnDeleteLink" type="button">Delete Link</button>
</form>

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

		const form = $('#exampleForm')[0];
		const data = new FormData(form);

		$.ajax({
			type: 'DELETE',
			url: 'https://vivoldi.com/api/link/v1/remove',
			data: data,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			processData: false,
			contentType: false,
			cache: false,
			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/v1/remove";
$params = array (
	"linkId" => "4Rt3",
	"domain" => "https://vvd.bz"
);

$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, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10000);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

$result = curl_exec($ch);

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

import okhttp3.*;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;

public class DeleteLink {
	public static void main(String[] args) {
		RequestBody requestBody = new FormBody.Builder()
			.add("linkId", "4Rt3")
			.add("domain", "https://vvd.bz")
			.build()
		;

		Request request = new Request.Builder()
		   .url("https://vivoldi.com/api/link/v1/remove")
		   .addHeader("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
		   .delete(requestBody)
		   .build();

		OkHttpClient client = new OkHttpClient();
		try {
		   Response response = client.newCall(request).execute();
		   if (response.isSuccessful()) {
				ResponseBody body = response.body();
				if (body != null) {
					 String jsonText = body.string();
					 body.close();
					 JSONObject json = new JSONObject(jsonText);
					 if (json.getInt("code") == 0) {
						  System.out.println("Success!");
					 } else {
						  System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
					 }
				}
		   }
		} catch (IOException e) {
		   e.printStackTrace();
		}
	}
}
Response:
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
    "code":0,
    "message":""
}
Response:
필드설명유형
code응답 코드 (0:성공)int
message응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨.string

그룹 목록

생성된 링크 그룹의 목록을 조회합니다.

Request:
Post /api/group/v1/list HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
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">
	그룹 이름: <input type="text" id="nm" name="nm" value=""/><br/>
	<button id="btnGroupList" type="button">Get group list</button>
</form>

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

		const form = $('#exampleForm')[0];
		const data = new FormData(form);

		$.ajax({
			type: 'GET',
			url: 'https://vivoldi.com/api/group/v1/list',
			data: data,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			processData: false,
			contentType: false,
			cache: false,
			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
$nm = "";  // 검색할 그룹 이름
$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, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
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 okhttp3.*;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;

public class DeleteLink {
	public static void main(String[] args) {
		String nm = "";  // 검색할 그룹 이름

		Request request = new Request.Builder()
		   .url("https://vivoldi.com/api/group/v1/list?nm="+nm)
		   .addHeader("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
		   .build();

		OkHttpClient client = new OkHttpClient();
		try {
		   Response response = client.newCall(request).execute();
		   if (response.isSuccessful()) {
				ResponseBody body = response.body();
				if (body != null) {
					 String jsonText = body.string();
					 body.close();
					 JSONObject json = new JSONObject(jsonText);
					 if (json.getInt("code") == 0) {
						  System.out.println("Success!");
					 } else {
						  System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
					 }
				}
		   }
		} catch (IOException e) {
		   e.printStackTrace();
		}
	}
}
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

유효기간, 비밀번호, 최대 클릭 허용 수가 설정된 링크 검증

본 API는 프리미엄 요금제부터 사용할 수 있습니다.

링크 접속에 제한을 할 때 유효기간, 비밀번호, 최대 클릭 허용 수를 설정합니다.
사용자들이 비볼디에서 생성한 링크를 클릭하면 상관없지만 만약, 브라우저에서 긴 URL로 직접 접속을 할 경우 검증할 방법이 없습니다.
비볼디는 이러한 문제를 해결하기 위해 별도의 JavaScript SDK를 제공합니다.

긴 링크의 페이지에 비볼디에서 제공하는 SDK를 추가하면 SDK에서 해당 링크의 정보를 조회한 후 유효기간, 비밀번호, 최대 클릭 허용 수를 체크하고
다시 비볼디의 짧은 링크로 Redirect 처리하거나 접근을 차단합니다.

귀하의 이벤트 또는 프로모션 페이지에 비볼디에서 제공하는 스크립트를 <head>...</head> 사이에 추가하고 단 1줄의 코드 작성만으로 쉽게 검증할 수 있습니다.

귀하의 페이지에 아래와 같이 비볼디의 스크립트를 추가하세요:

<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:
Post /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">
	링크 ID: <input type="text" id="linkId" name="linkId" value="xY5h"/><br/>
	링크 도메인: <input type="text" id="domain" name="domain" value="https://vvd.bz"/><br/>
	<button id="btnValidate" type="button">Get validate</button>
</form>

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

		const form = $('#exampleForm')[0];
		const data = new FormData(form);

		$.ajax({
			type: 'GET',
			url: 'https://vivoldi.com/api/validate/v1/link',
			data: data,
			headers: {'Authorization':'APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX'},
			processData: false,
			contentType: false,
			cache: false,
			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 = "xY5h";  // 링크 ID
$domain = urlencode("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, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)");
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
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 okhttp3.*;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;

public class LinkValidate {
	public static void main(String[] args) {
		String linkId = "xY5h";  // 링크 ID
		String domain = URLEncoder.encode("https://vvd.bz", StandardCharsets.UTF_8);  // 링크 도메인

		Request request = new Request.Builder()
		   .url("https://vivoldi.com/api/validate/v1/link?linkId="+linkId+"&domain="+domain)
		   .addHeader("Authorization", "APIKey oc3w9m4ytso9mv5e8yse9XXXXXXXXXX")
		   .build();

		OkHttpClient client = new OkHttpClient();
		try {
		   Response response = client.newCall(request).execute();
		   if (response.isSuccessful()) {
				ResponseBody body = response.body();
				if (body != null) {
					 String jsonText = body.string();
					 body.close();
					 JSONObject json = new JSONObject(jsonText);
					 if (json.getInt("code") == 0) {
						  System.out.println("Success!");
					 } else {
						  System.out.println("Failed: " + String.format("[%d] %s", json.getInt("code"), json.getString("message")));
					 }
				}
		   }
		} catch (IOException e) {
		   e.printStackTrace();
		}
	}
}
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

푸시 메시지 전송을 위한 웹 브라우저에서 알림 권한 동의 처리

본 API는 비볼디의 단축URL 서비스와 무관하며, 웹 사이트를 운영하는 모든 사람들을 대상으로 합니다.

귀하의 웹 사이트에 방문한 사용자에게 푸시 메시지를 전송하기 위해서는 사용자가 귀하의 웹 사이트에 대한 알림 권한에 동의해야 합니다.
사용자가 알림 권한에 거부할 경우 푸시 메시지를 전송할 수 없습니다.

본 API를 이용하면 웹 사이트에 방문했을 때 웹 브라우저에서 알림 권한에 대한 팝업 창을 표시합니다.
사용자가 알림 권한에 동의하면 대시보드의 "푸시 메시지 -> 웹사이트 푸시 발송" 페이지에 알림 데이타가 목록에 표시됩니다.
만약, 100명의 사용자가 귀하의 웹 사이트에서 알림 권한에 동의했다면 100개의 데이타가 목록에 표시됩니다.
대시보드에서 푸시 메시지를 전송하면 목록에 표시되는 모든 사용자에게 메시지가 전송됩니다.

비볼디에서 제공하는 SDK 적용은 제한없이 누구나 할 수 있으며 푸시 메시지를 전송하기 위해서는 금액이 충전되어 있어야 합니다.
푸시 메시지 전송 건당 10원이며 월 정액제를 신청하시면 무제한 발송이 가능합니다.

귀하의 웹 사이트 페이지에 비볼디에서 제공하는 스크립트를 <head>...</head> 사이에 추가하기만 하면 됩니다.

<html>
<head>
<title>샘플 페이지</title>
<script src="https://opencdn.vivoldi.com/js/webpush.min.js?ver=202404201" type="text/javascript"></script>
<script>
const apiKey = 'oc3w9m4ytso9mv5e8yse9XXXXXXXXXX';   // 귀하의 API Key
const publicKey = 'XXXXXYTRlpG8mXXXXXiuBZ6BtjyOfgPsDArFYWF2PxZbY4egmDNias1gEfN_5wftScr39K8BbcjXXXXX';   // "푸시 메시지 -> 도메인 관리" 페이지에서 등록한 도메인의 Public Key
const params = {apiKey:apiKey, publicKey:publicKey, callback:function(successful){
    if (!successful) {   // 알림 권한 동의에 실패한 경우...
        if (Notification.permission === 'denied') {   // 사용자가 알림 권한을 거부하거나 웹 브라우저에서 차단한 경우...

        }
    }
});
if (!webpush.checkPermission(params)) {   // 사용자가 알림 권한에 동의하지 않았다면...
    webpush.register(params);   // 알림 권한 팝업 창 띄우기
}
</script>
</head>

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

웹 페이지 로드 시 스크립트가 즉시 실행되면 웹 브라우저에서 알림 권한 팝업 창을 표시하지 않고 차단할 확율이 높습니다.
따라서 버튼의 onclick 이벤트에 해당 스크립트를 삽입하는 것을 추천드립니다.