URL短縮開発者API
開発者API紹介
Vivoldiは貴社のプラットフォームまたはシステム用に専用のREST APIを提供します。
REST APIを利用すれば、Vivoldiダッシュボードからリンクを作成することなく、お客様が所有しているサーバーやモバイルアプリから自由にリンクを作成することができます。
提供されるREST APIはJavaScript、PHP、Java、Android、iOSなどの開発言語とオペレーティングシステムに関係なく、自由にAPIを呼び出すことができます。
APIを呼び出す前に必ずAPI Keyが生成されている必要があり、生成されたAPI Keyは他人に公開されないように管理が必要です。
API Keyの変更は1ヶ月ごとに可能で、API Keyが変更されても既に生成されたリンクには何の影響もありません。
すべてのAPIは無料プランでもいくらでも利用でき、Vivoldiが定めたRequest規格に従い、プランによってAPI処理と応答速度が異なります。
API呼び出し後にHTTP 403エラーが発生した場合、Headerに別のUser-agent値を指定してください。
Vivoldiは一部の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ドメインが選択されます。 Vivoldiのランダムドメインを利用している場合、またはあなたが所有しているドメインをVivoldiと連動した場合、そのドメインを設定します。 | string | |
grpIdx | グループID | グループIDを設定すると、そのグループにリンクが生成されます。 グループIDを確認するには、「グループリスト」APIを呼び出して確認する必要があります。 | int | |
brandLinkId | ブランドリンクID | 値を指定すると、そのIDでリンクが生成されます。 (ブランドリンクが設定されている場合、ドメインはvvd.bzではなくvvd.imです) 値が空の場合、リンクIDは自動的に生成されます。 | string | |
ttl | リンクタイトル | 値が空の場合、自動的に長いリンクのウェブページのタイトルとして保存されます。 | string | |
memo | メモ | ユーザーに公開されず、管理に必要な付加情報を設定することができます。 | string | |
notfSubscYn | プッシュリンク | 値がYの場合、生成されたリンクをクリックすると、長いリンクに移動する前にWebプッシュ通知ポップアップが表示され、ユーザーがプッシュ通知を許可した場合、許可したすべてのユーザーにプッシュメッセージを送信することができます。 通知ポップアップに同意しないか、キャンセルする場合、すぐに元の長いURLに移動します。 値を入力しない場合、デフォルト値はNです。 プッシュサブスクリプションリンクの詳細については、「Webプッシュ機能紹介」ページをご覧ください。 | Y or N | |
clksIpFilteringYn | IPフィルタリング | 値がYの場合、24時間の間、同じIPからリンクをクリックすると、リンククリック数が増加せず、1に固定されます。 真夜中(午前12時)が過ぎてから再度リンクをクリックすると、クリック数が+1されます。 クリック数IPフィルタリング機能は、リンク作成時にのみ設定が可能で、その後のリンク修正で値を変更することはできません。 この機能はパーソナルプランから利用できます。 | Y or N | |
pushNotifyYn | クリック数プッシュ通知 | 値がYの場合、「設定 -> 環境設定」ページのリンク設定で設定されたリンククリック数に達するたびに、Vivoldiアプリがインストールされたモバイルデバイスにクリック数プッシュ通知を受け取ることができます。 この機能はパーソナルプランから利用できます。 | Y or N | |
mailNotifyYn | クリック数メール通知 | 値がYの場合、「設定 -> 環境設定」ページのリンク設定で設定されたリンククリック数に達するたびに、Vivoldiに登録されたメールでクリック数情報を受け取ることができます。 この機能はパーソナルプランから利用できます。 | 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の場合、生成されたリンクをクリックすると、長いリンクに移動する前にWebプッシュ通知ポップアップが表示され、ユーザーがプッシュ通知を許可した場合、許可したすべてのユーザーにプッシュメッセージを送信することができます。 通知ポップアップに同意しない場合、またはキャンセルする場合、すぐに元の長いURLに移動します。 値を入力しない場合、デフォルト値はNです。 プッシュサブスクリプションリンクの詳細については、ここをクリックしてください。 | Y or N | |
pushNotifyYn | クリック数プッシュ通知 | 値がYの場合、「設定 -> 環境設定」ページのリンク設定で設定されたリンククリック数に達するたびに、Vivoldiアプリがインストールされたモバイルデバイスにクリック数プッシュ通知を受け取ることができます。 この機能はパーソナルプランから利用できます。 | Y or N | |
mailNotifyYn | クリック数メール通知 | 値がYの場合、「設定 -> 環境設定」ページのリンク設定で設定されたリンククリック数に達するたびに、Vivoldiに登録されたメールでクリック数情報を受け取ることができます。 この機能はパーソナルプランから利用できます。 | 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
フィールド | フィールドの説明 | 説明 | 必須 | タイプ |
---|---|---|---|---|
リンクID | 링크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を1日に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:Bivoldiダッシュボードで生成したリンク、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 | |
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: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はプレミアムプランからご利用いただけます。
リンクアクセスに制限をかける場合、有効期間、パスワード、最大クリック許可数を設定します。
ユーザーがVivoldiで生成したリンクをクリックする場合は問題ありませんが、もし、ブラウザで長いURLで直接接続する場合、検証する方法がありません。
Vivoldiはこのような問題を解決するために、別途JavaScript SDKを提供しています。
長いリンクのページにVivoldiで提供するSDKを追加すると、SDKで当該リンクの情報を照会した後、有効期間、パスワード、最大クリック許可数をチェックし再びVivoldiの短いリンクにRedirect処理したり、アクセスをブロックします。
あなたのイベントやプロモーションページにVivoldiが提供するスクリプトを
あなたのページに以下のようにビボディのスクリプトを追加してください:
<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 이벤트에 해당 스크립트를 삽입하는 것을 추천드립니다.