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를 차단합니다.
API 호출 방법
Host: https://vivoldi.com/api HTTP/1.1
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
{
"code": 0,
"message": "",
"result": Object
}
message - 응답 메시지로 응답 코드가 0이 아닌 경우 오류 메시지가 리턴됩니다.
result - 응답 값으로 API 유형에 따라 문자 또는 JSON Object로 리턴됩니다.
링크 생성
1개의 단축 링크를 생성합니다. 만약, 대량의 링크를 만들고자 한다면 대시보드의 "대량 링크 만들기" 메뉴를 이용하세요.
Post /api/link/v1/create HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
필드 | 필드 설명 | 설명 | 필수 | 유형 |
---|---|---|---|---|
url | 긴 URL | 생성된 짧은 링크를 클릭했을 때 이동될 긴 URL | string | |
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 |
<!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();
}
}
}
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
"code":0,
"message":"",
"result":"https://vvd.bz/jH3d"
}
필드 | 설명 | 유형 |
---|---|---|
code | 응답 코드 (0:성공) | int |
message | 응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨. | string |
result | 응답 값 (단축된 링크) | string |
링크 수정
생성한 짧은 링크를 수정합니다.
Post /api/link/v1/edit HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
필드 | 필드 설명 | 설명 | 필수 | 유형 |
---|---|---|---|---|
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 |
<!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();
}
}
}
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
"code":0,
"message":""
}
필드 | 설명 | 유형 |
---|---|---|
code | 응답 코드 (0:성공) | int |
message | 응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨. | string |
링크 삭제
생성한 짧은 링크를 삭제합니다.
Post /api/link/v1/remove HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
필드 | 필드 설명 | 설명 | 필수 | 유형 |
---|---|---|---|---|
linkId | 링크Id | 생성된 짧은 링크의 ID 예: 짧은 링크의 주소가 "https://vvd.bz/fML"이면 링크ID는 fML 입니다. | string | |
domain | 도메인 | 짧은 링크 주소의 도메인. 예: 짧은 링크의 주소가 "https://vvd.bz/fML"이면 도메인은 https://vvd.bz 입니다. 중요: https:// 또는 http:// 값을 반드시 입력해야 합니다. 생성된 짧은 링크의 도메인이 아닌 다른 도메인으로 설정할 경우 오류가 발생합니다. | string |
<!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();
}
}
}
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
"code":0,
"message":""
}
필드 | 설명 | 유형 |
---|---|---|
code | 응답 코드 (0:성공) | int |
message | 응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨. | string |
링크 목록
생성된 링크의 목록을 조회합니다.
URL 링크만 조회 가능하며 이외 유형의 링크는 조회되지 않습니다.
무료 요금제의 경우 본 API를 하루에 30회 호출할 수 있는 제약이 있습니다.
Post /api/link/v1/list HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
필드 | 필드 설명 | 설명 | 필수 | 유형 |
---|---|---|---|---|
linkId | 링크 ID | 링크 ID로 목록을 조회합니다. | string | |
domain | 도메인 | 링크 도메인으로 목록을 조회합니다. 도메인 앞에 반드시 http:// 또는 https:// 값을 붙여야 합니다. | string | |
createTypeIdx | 생성 유형IDX | 0:모든 링크, 270:비볼디 대시보드에서 생성한 링크, 272:API 호출을 통해 생성한 링크, 274:대량 링크 생성 | int | |
grpIdx | 그룹ID | 그룹 ID로 목록을 조회합니다. 값이 없을 경우 기본 값 0으로 설정됩니다. | int | |
url | 긴 URL | 긴 URL로 목록을 조회합니다. URL 주소의 부분 검색이 가능합니다. | string | |
ttl | 링크 제목 | 링크의 제목으로 목록을 조회합니다. 제목의 부분 검색이 가능합니다. | string | |
brandLinkYn | 브랜드 링크 | 링크 ID가 자동으로 생성되지 않고 직접 설정한 경우는 브랜드 링크입니다. Y:사용함(브랜드 링크), N:사용안함(자동으로 생성된 링크) | Y or N | |
notfSubscYn | 푸시구독 링크 | Y:사용함, N:사용안함 | Y or N | |
blockOverseasSticsYn | 해외통계 차단 | Y:사용함, N:사용안함 | Y or N | |
clksIpFilteringYn | 클릭 수 IP 필터링 | Y:사용함, N:사용안함 | Y or N | |
pushNotifyYn | 클릭 수 푸시 알림 | Y:사용함, N:사용안함 | Y or N | |
mailNotifyYn | 클릭 수 메일 알림 | Y:사용함, N:사용안함 | Y or N | |
regStartYmdt | 생성 시작 날짜 | 링크를 생성한 시작 날짜로 생성 날짜가 시작 날짜와 종료 날짜 사이 포함되어야 합니다. 예: 2022-11-08 00:00:00 | Date | |
regEndYmdt | 생성 종료 날짜 | 링크를 생성한 종료 날짜로 생성 날짜가 시작 날짜와 종료 날짜 사이 포함되어야 합니다. 예: 2022-11-08 23:59:59 종료 날짜는 시작 날짜보다 1달 이내로 설정되어야 합니다. | Date | |
pages | 페이지 | pages 값은 페이징 처리에 사용되며 기본 값은 1 입니다. 한 페이지에 기본적으로 30개의 행이 조회되며 pages의 값이 2일 경우 31번 째 행 부터 30개의 데이터가 조회됩니다. | int |
<!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="ttl" name="ttl" value=""/><br/>
생성 시작 날짜: <input type="text" id="regStartYmdt" name="regStartYmdt" value="2022-11-01 00:00:00"/><br/>
생성 종료 날짜: <input type="text" id="regEndYmdt" name="regEndYmdt" value="2022-11-30 23:59:59"/><br/>
<button id="btnGroupList" type="button">Get link list</button>
</form>
<script type="text/javascript">
$(function(){
$("#btnLinkList").on('click', function(evt){
evt.preventDefault();
const form = $('#exampleForm')[0];
const data = new FormData(form);
$.ajax({
type: 'GET',
url: 'https://vivoldi.com/api/link/v1/list',
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
$nm = "테스트"; // 검색할 링크 제목
$regStartYmdt = "2022-11-01 00:00:00"; // 링크 생성 시작 날짜
$regㄷEndYmdt = "2022-11-30 23:59:59"; // 링크 생성 종료 날짜
$url = "https://vivoldi.com/api/group/v1/list?nm=$nm®StartYmdt=$regStartYmdt®EndYmdt=$regEndYmdt";
$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 = ""; // 검색할 링크 제목
String regStartYmdt = "2022-11-01 00:00:00"; // 링크 생성 시작 날짜
String regEndYmdt = "2022-11-30 23:59:59"; // 링크 생성 종료 날짜
Request request = new Request.Builder()
.url("https://vivoldi.com/api/group/v1/list?nm="+nm+"®StartYmdt="+regStartYmdt+"®EndYmdt="+regEndYmdt)
.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();
}
}
}
HTTP/1.1 200 OK
Content-type: application/json;charset=UTF-8
{
"code":0,
"message":"",
"result":{
"extra": {
"pages":1,
"nextPages":1,
"nextYn":"N",
"count":2,
"totalCount":2
},
"list": [
{
"linkId":"createpostinglinks",
"domain":"https://vvd.im",
"typeIdx":103,
"typeNm":"URL",
"ttl":"게시물 링크를 이용한 유튜브 동영상을 추가하여 짧은 링크 만들기",
"memo":"",
"url":"https://vvd.im/createpostinglinks",
"grpIdx":0,
"grpNm":"",
"acesCnt":5072,
"acesCntToday":315,
"lastClkYmdt":"2022-11-07 04:45:10",
"longUrl":"https://vivoldi.com/blog/url-shortener/create-posts-link-url-shortener/",
"blockOverseasSticsYn":"N",
"notfSubscYn":"N",
"kakaoNotifyYn":"N",
"pushNotifyYn":"N",
"mailNotifyYn":"N",
"clksIpFilteringYn":"N",
"regYmdt":"2022-11-02 04:27:05",
"modYmdt":"2022-11-02 04:27:05"
},
{
"linkId":"4Rth",
"domain":"https://vvd.bz",
"typeIdx":103,
"typeNm":"URL",
"ttl":"NAVER",
"memo":"",
"url":"https://vvd.bz/4Rth",
"grpIdx":128,
"grpNm":"테스트",
"acesCnt":19,
"acesCntToday":3,
"lastClkYmdt":"2022-11-07 17:20:40",
"longUrl":"https://www.naver.com",
"blockOverseasSticsYn":"N",
"notfSubscYn":"N",
"kakaoNotifyYn":"N",
"pushNotifyYn":"Y",
"mailNotifyYn":"N",
"clksIpFilteringYn":"Y",
"regYmdt":"2022-11-07 17:10:22",
"modYmdt":"2022-11-07 17:10:22"
}
]
}
}
필드 | 설명 | 유형 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code | 응답 코드 (0:성공) | int | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
message | 응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨. | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
result | extra (추가 정보)
list (링크 목록) - Array
| array |
그룹 목록
생성된 링크 그룹의 목록을 조회합니다.
Post /api/group/v1/list HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
필드 | 필드 설명 | 설명 | 필수 | 유형 |
---|---|---|---|---|
grpIdx | 그룹 ID | 그룹 ID로 목록을 조회합니다. | int | |
nm | 그룹 이름 | 그룹 이름을 설정하면 그룹 목록을 조회할 때 그룹 이름을 검색하여 조회합니다. 그룹 이름 검색은 equals 조회가 아닌 like 조회입니다. | string |
<!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();
}
}
}
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"
}
]
}
필드 | 설명 | 유형 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code | 응답 코드 (0:성공) | int | ||||||||||||||||||||||||||||||||||||||||||||||||||||
message | 응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨. | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||
result | 그룹 목록:
| 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>
Post /api/validate/v1/link HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/x-www-form-urlencoded
필드 | 필드 설명 | 설명 | 필수 | 유형 |
---|---|---|---|---|
linkId | 링크 ID | 유효기간, 비밀번호, 최대 클릭 허용 수가 설정된 링크의 ID | string | |
domain | 도메인 | 생성된 링크의 도메인 | string |
<!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();
}
}
}
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"
}
}
필드 | 설명 | 유형 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code | 응답 코드 (0:성공) | int | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
message | 응답 메시지, 응답 코드가 0이 아닐 경우 관련 메시지가 리턴됨. | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
result |
| 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 이벤트에 해당 스크립트를 삽입하는 것을 추천드립니다.