Vivoldi Short URL API pour les développeurs

Guide de l’API REST pour la création d’URL courtes

Vivoldi fournit une API REST dédiée qui peut être intégrée de manière transparente dans votre site web, votre application mobile ou votre système interne.
Grâce à cette API, vous pouvez générer et gérer des URL courtes directement depuis votre serveur ou votre application, sans accéder au tableau de bord de Vivoldi.

L’API REST est conçue pour fonctionner avec un large éventail de langages de programmation et de plateformes, notamment JavaScript, PHP, Java, Android et iOS.
Avant d’utiliser l’API, vous devez générer une clé API et la conserver en toute sécurité sans l’exposer à des tiers.

Les clés API peuvent être mises à jour une fois par mois, et les URL courtes existantes ne seront pas affectées.
Tous les utilisateurs, y compris ceux du plan gratuit, peuvent accéder à l’API, mais la fréquence des demandes et la vitesse de réponse peuvent varier en fonction de votre plan.

Si vous rencontrez une erreur HTTP 403 lorsque vous appelez l’API, veuillez spécifier une valeur User-Agent unique dans votre en-tête de demande.
Vivoldi bloque activement les crawlers et les bots malveillants et maintient une liste noire interne d’adresses IP.
Pour garantir une communication API stable, utilisez le nom de votre entreprise ou de votre marque (en anglais) comme chaîne User-Agent.

Vivoldi peut redémarrer les serveurs pendant les déploiements de fonctionnalités, les correctifs de sécurité ou la maintenance du système.
Pour éviter les perturbations, nous recommandons vivement de mettre en œuvre une logique de relance pour toutes les demandes d’API.

Vivoldi Short URL API pour les développeurs

Comment appeler l’API

Request:
Host: https://vivoldi.com/api HTTP/1.1
Authorization: APIKey {Your API Key}
Content-type: application/json
Il suffit d’ajouter Authorisation, Content-type à votre en-tête Http et d’appeler l’API.
Response:
{
    "code": 0,
    "message": "",
    "result": Object
}
code - Le code de réponse, où 0 correspond à un succès et toute autre valeur à un code d’échec.
message - Le message de réponse, un message d’erreur est renvoyé si le code de réponse est différent de zéro.
result - La valeur de la réponse, renvoyée sous la forme d’un caractère ou d’un objet JSON en fonction du type d’API.
Veuillez contacter Vivoldi si vous avez besoin d’améliorations ou de modifications de l’API REST.

Créer un lien

Si vous souhaitez créer un seul lien court, vous pouvez facilement le générer à l’aide de cette API.
Pour créer plusieurs liens à la fois, essayez d’utiliser l’API de création de liens en bloc.
Vous pouvez également générer rapidement des liens à l’aide du menu "Bulk Link Generator" (Générateur de liens en masse) du tableau de bord.

Pour les utilisateurs du plan gratuit, les appels à l’API sont limités à 10 requêtes par minute.
Si vous avez besoin d’un volume plus important, envisagez de passer à un plan payant pour bénéficier d’un accès étendu.

Chaque lien court inclut automatiquement un code QR, accessible via le format d’URL `vvd.bz/[linkId]/qr`.
Pour ajuster la taille du code QR, il suffit d’ajouter le paramètre `size` à l’URL.
Par exemple, utilisez `vvd.bz/[linkId]/qr?size=200` pour générer un code QR d’une taille de 200 pixels.

Request:
Post /api/link/v2/create HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
DomainesDescription des champsDescriptionExigéeType
urlURL longue L’URL longue vers laquelle l’utilisateur sera redirigé lorsqu’il clique sur le lien court.
Taille maximale: 3000 octets.
string
domainDomaine Si ce champ est vide, le domaine par défaut sera vvd.bz.
Le champ doit inclure “https://”, et si l’option “brandLinkId” est “Y”, utiliser le domaine “https://vvd.im”.
Si votre domaine est relié à Vivoldi, vous pouvez le définir ici.
Exemple: https://vvd.bz
string
redirectTypeType de redirection Définit comment la redirection se fait de l’URL courte vers l’URL longue.
Valeurs possibles: 200, 301 ou 302 (HTTP). Valeur par défaut: 302
Pour plus de détails, voir la page “Glossaire”.
int
grpIdxID de groupe Renseigner un ID de groupe permet d’associer le lien à ce groupe.
Pour l’obtenir, utilisez l’API “Liste des groupes”.
int
brandLinkIdID de lien de marque Si une valeur est renseignée, le lien sera créé avec cet ID.
(Si configuré, le domaine sera vvd.im et non vvd.bz.)
Si vide, l’ID de lien est généré automatiquement.
string
ttlTitre du lien Si vide, le titre de la page web de l’URL longue sera utilisé.
Si vide, Vivoldi analysera le HTML de l’URL longue, ce qui peut ralentir la réponse. Renseignez le titre si possible.
string
descriptionMéta description Vous pouvez définir la méta description si “redirectType” vaut “200”.
Ce champ est ignoré si “redirectType” est “301”, “302”, etc.
string
metaImgMéta-image Vous ne pouvez définir la balise méta-image que lorsque la valeur de redirectType est « 200 ».
La valeur méta-image doit être au format URL commençant par « https:// ».
Si redirectType est « 301 » ou « 302 », la valeur est ignorée.
string
memoNotes Vous pouvez ajouter des informations supplémentaires pour la gestion, non visibles par les utilisateurs. string
notfSubscYnLien Push Si la valeur est Y, une fenêtre de notification push s’affichera avant la redirection, et vous pourrez envoyer des notifications à tous les utilisateurs qui l’autorisent.
Si l’utilisateur refuse ou ferme la fenêtre, il est redirigé vers l’URL longue.
Par défaut (si vide), la valeur est N.
Pour plus d’informations, consultez la page dédiée Web Push.
Y ou N
pushNotifyYnNotifications push Si Y, vous recevrez une notification push sur mobile (avec l’app Vivoldi) à chaque fois que le nombre de clics configuré dans “Préférences” est atteint.
Disponible à partir du forfait Personnel.
Y ou N
mailNotifyYnNotifications e-mail Si Y, vous recevrez un e-mail chaque fois que le seuil de clics défini dans les préférences du lien est atteint.
Disponible à partir du forfait Personnel.
Y ou N
delYmdDate de suppression du lien Après la date renseignée, le lien est automatiquement supprimé par le système.
Cycle de suppression: chaque heure
Exemple: 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:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string
resultValeur de la réponse (lien abrégé)string

Création de liens en masse

Créer plusieurs liens raccourcis en une seule fois.
Si vous souhaitez créer un grand nombre de liens en une seule fois, utilisez le menu "Créer des liens en masse" dans le tableau de bord.

Vous ne pouvez créer qu’un nombre limité de liens à la fois, et les limites par plan sont les suivantes
Si vous souhaitez générer 3 000 liens, vous devrez appeler cette API plusieurs fois.

Plan personnel : Jusqu’à 200
Plan Premium : jusqu’à 500
Plan d’affaires : jusqu’à 1 000

Cette API est disponible à partir du plan personnel.

Request:
Post /api/link/v1/createBulk HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
DomainesType
links
DomainesDescription des champsDescriptionExigéeType
urlURL longue L’URL longue vers laquelle l’utilisateur sera redirigé lorsqu’il clique sur le lien court.
Taille maximale: 3000 octets.
string
domainDomaine Si ce champ est vide, le domaine par défaut sera vvd.bz.
Le champ doit inclure “https://”, et si l’option “brandLinkId” est “Y”, utiliser le domaine “https://vvd.im”.
Si votre domaine est relié à Vivoldi, vous pouvez le définir ici.
Exemple: https://vvd.bz
string
redirectTypeType de redirection Définit comment la redirection se fait de l’URL courte vers l’URL longue.
Valeurs possibles: 200, 301 ou 302 (HTTP). Valeur par défaut: 302
Pour plus de détails, voir la page “Glossaire”.
int
grpIdxID de groupe Renseigner un ID de groupe permet d’associer le lien à ce groupe.
Pour l’obtenir, utilisez l’API “Liste des groupes”.
int
brandLinkIdID de lien de marque Si une valeur est renseignée, le lien sera créé avec cet ID.
(Si configuré, le domaine sera vvd.im et non vvd.bz.)
Si vide, l’ID de lien est généré automatiquement.
string
ttlTitre du lien Si vide, le titre de la page web de l’URL longue sera utilisé.
Si vide, Vivoldi analysera le HTML de l’URL longue, ce qui peut ralentir la réponse. Renseignez le titre si possible.
string
descriptionMéta description Vous pouvez définir la méta description si “redirectType” vaut “200”.
Ce champ est ignoré si “redirectType” est “301”, “302”, etc.
string
metaImgMéta-image Vous ne pouvez définir la balise méta-image que lorsque la valeur de redirectType est « 200 ».
La valeur méta-image doit être au format URL commençant par « https:// ».
Si redirectType est « 301 » ou « 302 », la valeur est ignorée.
string
memoNotes Vous pouvez ajouter des informations supplémentaires pour la gestion, non visibles par les utilisateurs. string
notfSubscYnLien Push Si la valeur est Y, une fenêtre de notification push s’affichera avant la redirection, et vous pourrez envoyer des notifications à tous les utilisateurs qui l’autorisent.
Si l’utilisateur refuse ou ferme la fenêtre, il est redirigé vers l’URL longue.
Par défaut (si vide), la valeur est N.
Pour plus d’informations, consultez la page dédiée Web Push.
Y ou N
pushNotifyYnNotifications push Si Y, vous recevrez une notification push sur mobile (avec l’app Vivoldi) à chaque fois que le nombre de clics configuré dans “Préférences” est atteint.
Disponible à partir du forfait Personnel.
Y ou N
mailNotifyYnNotifications e-mail Si Y, vous recevrez un e-mail chaque fois que le seuil de clics défini dans les préférences du lien est atteint.
Disponible à partir du forfait Personnel.
Y ou N
delYmdDate de suppression du lien Après la date renseignée, le lien est automatiquement supprimé par le système.
Cycle de suppression: chaque heure
Exemple: 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:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string
resultValeur de la réponse (lien abrégé)string

Modifier un lien

Modifiez le lien court que vous avez créé.
Vous ne pouvez modifier le type de lien que s’il s’agit d’une URL ; les autres types ne sont pas modifiés, même si l’appel à l’API aboutit.

Request:
Put /api/link/v2/edit HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
DomainesDescription des champsDescriptionExigéeType
linkIdID de lien ID du lien court généré.
Exemple :
Si l’adresse du lien court est "https://vvd.bz/fML", l’ID de lien est fML.
string
domainDomaine Le domaine de l’adresse du lien court.
Exemple :
Si l’adresse du lien court est "https://vvd.bz/fML", le domaine est https://vvd.bz.
Important : Vous devez saisir https:// ou http://.
Si vous indiquez un domaine différent de celui du lien généré, une erreur se produira.
string
redirectTypeType de redirection Définit la méthode de redirection du lien court vers l’URL longue.
Valeurs possibles : 200, 301 ou 302 (HTTP). Par défaut : 302.
Pour plus d’informations, voir la page “Glossaire”.
int
grpIdxID de groupe Permet de changer le groupe du lien généré.
Pour obtenir l’ID de groupe, vous devez utiliser l’API "Liste des groupes".
int
urlURL longue Permet de modifier l’URL longue.
La modification de l’URL longue est disponible à partir de l’offre Premium.
string
ttlTitre du lien Si la valeur est vide, le titre du lien ne sera pas modifié. string
descriptionMéta description Vous pouvez définir la balise meta description de la page si “redirectType” vaut “200”.
Ce champ est ignoré si “redirectType” est “301”, “302”, etc.
string
metaImgMéta-image Vous ne pouvez définir la balise méta-image que lorsque la valeur de redirectType est « 200 ».
La valeur méta-image doit être au format URL commençant par « https:// ».
Si redirectType est « 301 » ou « 302 », la valeur est ignorée.
string
memoNotes Vous pouvez ajouter des informations administratives supplémentaires, qui ne seront pas visibles par les utilisateurs.
Si le champ est vide, la note ne sera pas modifiée.
string
notfSubscYnLien Push Si la valeur est Y, cliquer sur le lien généré affichera une notification push avant de diriger vers l’URL longue. Si l’utilisateur a accepté les notifications push, vous pouvez envoyer un message push à tous les utilisateurs autorisés.
Si l’utilisateur refuse ou ferme la notification, il sera immédiatement redirigé vers l’URL longue.
Si vous ne renseignez pas de valeur, la valeur par défaut sera N.
Pour en savoir plus sur les liens d’abonnement push, cliquez ici.
Y ou N
pushNotifyYnNotifications push Si la valeur est Y, vous recevrez des notifications push sur vos appareils mobiles avec l’application Vivoldi installée chaque fois qu’un lien atteint le nombre de clics défini dans les paramètres du lien dans "Paramètres -> Préférences".
Cette fonctionnalité est disponible à partir de l’offre Personnel.
Y ou N
mailNotifyYnNotifications e-mail Si la valeur est Y, vous recevrez un e-mail à votre adresse Vivoldi à chaque fois que le nombre de clics défini dans les paramètres du lien dans "Paramètres -> Préférences" est atteint.
Cette fonctionnalité est disponible à partir de l’offre Personnel.
Y ou N
delYmdDate de suppression du lien Après la date indiquée, le lien est automatiquement supprimé par le système.
Cycle de suppression : toutes les heures.
Exemple : 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:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string

Supprimer un lien

Supprimez le lien court que vous avez créé.

Request:
Delete /api/link/v1/remove HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: -
Request:
DomainesDescription des champsDescriptionExigéeType
linkIdID de lien ID du lien court généré.
Exemple :
Si l’adresse du lien court est "https://vvd.bz/fML", l’ID de lien est fML.
L’encodage URL (URLEncode) est requis si vous définissez un LinkID personnalisé (ID défini par vous-même) et qu’il contient des caractères spéciaux.
string
domainDomaine Le domaine de l’adresse du lien court.
Exemple :
Si l’adresse du lien court est "https://vvd.bz/fML", le domaine est https://vvd.bz.
Important : La valeur doit commencer par https:// ou http://.
Si vous définissez un domaine différent de celui du lien généré, une erreur se produira.
Pour un LinkID personnalisé (ID que vous définissez vous-même), le domaine est 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:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string

Statistiques de clics par heure de la journée

Visualisez les clics et les cliqueurs au fil du temps pour un seul lien.

Cette API est disponible à partir du plan Business.

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

Statistiques de clics par date

Vous pouvez afficher le nombre de clics sur un lien unique par date et le nombre de personnes qui ont cliqué sur ce lien.
Lors d’une recherche, l’intervalle des dates de début et de fin ne peut être supérieur à un mois.

Cette API est disponible à partir du plan Business.

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

Liste des groupes

Permet d’obtenir une liste des groupes de liens créés.

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",
            "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",
            "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
regYmdt생성 날짜그룹이 생성된 날짜Date
modYmdt수정 날짜그룹이 수정된 날짜Date
array

Valider les liens avec les dates d’expiration, les mots de passe et le nombre maximum de clics autorisés

Cette API est disponible sur le plan Premium.

Lorsque vous restreignez l’accès à un lien, vous définissez une date d’expiration, un mot de passe et un nombre maximum de clics autorisés.
Si les utilisateurs cliquent sur un lien généré par Vivoldi, tout va bien, mais s’ils vont directement à une longue URL dans leur navigateur, il n’y a aucun moyen de la valider.
Vivoldi fournit un SDK JavaScript séparé pour résoudre ce problème.

Lorsque vous ajoutez le SDK à une page contenant un lien long, le SDK récupère les informations du lien et vérifie la date d’expiration, le mot de passe et le nombre maximal de clics autorisés.
Redirigez vers le lien court de Vivoldi ou bloquez l’accès.

Ajoutez le script fourni par Vivoldi à votre page d’événement ou de promotion entre les ... et validez facilement avec une seule ligne de code.

Ajoutez le script de Vivoldi à votre page comme indiqué ci-dessous :

<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

Créer un coupon

Cette API est disponible à partir du plan personnel.

Créer un coupon de réduction. Si vous souhaitez créer plusieurs coupons à la fois, créez-les dans le tableau de bord.
Vous ne pouvez pas télécharger les images des coupons à l’aide de l’API.
Dans ce cas, vous pouvez télécharger des images de coupon lorsque vous créez un groupe de coupons dans le tableau de bord et que vous spécifiez le groupe lorsque vous créez le coupon.
Si vous spécifiez un groupe de coupons lorsque vous créez un coupon, certains paramètres sont ignorés et les paramètres du groupe de coupons sont appliqués.

Request:
Post /api/coupon/v1/create HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
DomainesDescription des champsDescriptionExigéeType
cpnNo Un numéro de coupon de 8 à 16 chiffres composé de lettres majuscules et de chiffres. Les caractères spéciaux ne sont pas autorisés.
Si ce champ est vide, le numéro du coupon est généré automatiquement par le système.
string
grpIdx Les groupes de coupons servent à organiser les coupons par catégorie. En cas de conflit, le paramètre du coupon prévaut.
Voir l’IDX de groupe sur la page des groupes de coupons du tableau de bord.
Valeur par défaut : 0
int
tmplIdx Les modèles de coupons précisent l’usage, l’utilisation et les conditions du coupon.
L’IDX du modèle se trouve sur la page des modèles de coupons dans le tableau de bord.
Valeur par défaut : 0
int
nm Le nom du coupon apparaît sur la page du coupon. string
discTypeIdx Définir le type de réduction (taux ou montant) du coupon.
457 : Réduction en pourcentage (%), 458 : Réduction en montant.
Réduction en pourcentage : applique un pourcentage.
Réduction en montant : applique un montant fixe.
int
disc Saisir une valeur entre 1 % et 100 % pour un taux (457).
Entrer le montant pour une réduction en valeur (458).
double
discCurrency Possibilité de définir la devise pour les réductions en montant (458).
KRW : won coréen, USD : dollar américain, JPY : yen japonais, EUR : euro.
Valeur par défaut : KRW
string
strtYmd Définir la date de début de validité du coupon.
Valeur à 10 chiffres, format aaaa-mm-jj.
Exemple : 2024-10-01
date
endYmd Définir la date de fin de validité du coupon.
Valeur à 10 chiffres, format aaaa-mm-jj.
Exemple : 2024-12-31
date
onsiteYn Si la valeur est Y, la page du coupon affiche un bouton pour valider le coupon en magasin.
L’utilisateur présente le coupon à un employé, qui valide le coupon.
Utile pour les boutiques physiques.
Valeur par défaut : N
Y or N
onsitePwd En cas de mot de passe, le personnel du magasin doit le saisir pour valider le coupon.
L’utilisateur ne peut pas valider le coupon lui-même.
string
memo Utilisé à des fins internes pour gérer les coupons.
Non visible pour les utilisateurs.
string
url Si une URL est renseignée, la page du coupon affiche un bouton « Utiliser le coupon » qui dirige vers cette URL.
Si une image de coupon est ajoutée, cliquer sur l’image ouvre également l’URL.
string
useLimit Définir le nombre maximum d’utilisations par personne.
Si la limite par personne est comprise entre 2 et 5 (API REST Vivoldi), l’ID utilisateur est obligatoire.
Depuis le tableau de bord, vous pouvez choisir « Illimité » ou « 1 fois ».
Si vous choisissez « Illimité », le coupon peut être utilisé un nombre illimité de fois.
0 : Illimité, 1 : 1 fois, 2 : 2 fois, 3 : 3 fois, 4 : 4 fois, 5 : 5 fois
int
color Définir la couleur du texte du coupon sur la page.
À saisir en format HEX, jusqu’à 9 caractères, incluant la transparence.
Valeur par défaut : #4F4F4FFF
string
background Définir la couleur d’arrière-plan du coupon sur la page.
À saisir en format HEX, jusqu’à 9 caractères, incluant la transparence.
Valeur par défaut : #FFFFFFFF
string
userId Permet de savoir qui a émis ou utilisé le coupon.
Si la limite d’utilisations par personne est entre 2 et 5, l’ID utilisateur est obligatoire.
En général, il s’agit de l’identifiant de connexion de l’utilisateur.
string
userNm Si vous connaissez déjà l’utilisateur, renseignez son nom ici.
Utile pour gérer l’émission et l’utilisation du coupon.
string
userPhnno Saisir le contact de l’utilisateur qui utilisera le coupon. string
userEml Saisir l’adresse e-mail de l’utilisateur qui utilisera le coupon. string
userEtc1 Saisir des informations supplémentaires sur l’utilisateur à des fins administratives. string
userEtc2 Saisir des informations supplémentaires sur l’utilisateur à des fins administratives. 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:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string
resultValeur de la réponse (numéro de coupon)string

Editer le coupon

Cette API est disponible à partir du plan personnel.

Modifier les informations du coupon créé.
Lorsque vous affectez un groupe à un coupon, certains paramètres sont ignorés et les paramètres du groupe de coupons sont appliqués.
Pour les coupons qui ont déjà été échangés, vous ne pouvez modifier que les "Notes", mais pas les autres informations.

Request:
Put /api/coupon/v1/edit HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
DomainesDescription des champsDescriptionExigéeType
cpnNo Le numéro de coupon que vous souhaitez modifier. Saisissez uniquement le numéro du coupon, sans le caractère « - ». string
grpIdx Les groupes de coupons servent à organiser la catégorisation des coupons. Si les réglages du groupe et du coupon coexistent, les réglages du coupon sont ignorés.
Vous pouvez trouver l’IDX du groupe sur la page Groupes de coupons de votre tableau de bord.
Valeur par défaut : 0
int
tmplIdx Les modèles de coupon permettent de fournir une description, des instructions d’utilisation et des avertissements à l’utilisateur.
Vous pouvez trouver l’IDX du modèle sur la page Modèles de coupons de votre tableau de bord.
Valeur par défaut : 0
int
nm Le nom du coupon est affiché sur la page du coupon. string
discTypeIdx Définit le type de réduction pour le coupon (taux ou montant).
457 : Réduction en pourcentage (%), 458 : Réduction en montant
Réduction en pourcentage : utilisée pour offrir une remise en pourcentage.
Réduction en montant : utilisée pour offrir une remise à montant fixe.
int
disc Si le type de réduction est « taux » (457), indiquez une valeur comprise entre 1 % et 100 %.
Si le type de réduction est « montant » (458), indiquez le montant de la réduction.
double
discCurrency Vous pouvez définir l’unité monétaire lorsque le type de réduction est « montant » (458).
KRW : won coréen, USD : dollar américain, JPY : yen japonais, EUR : euro.
Valeur par défaut : KRW
string
strtYmd Définissez la date de début de validité du coupon.
Valeur à 10 chiffres au format aaaa-mm-jj.
Exemple : 2024-10-01
date
endYmd Définissez la date d’expiration du coupon.
Valeur à 10 chiffres au format aaaa-mm-jj.
Exemple : 2024-12-31
date
onsiteYn Si cette valeur est Y, un bouton s’affiche sur la page du coupon pour valider l’utilisation du coupon.
L’utilisateur présente le coupon à un membre du personnel qui effectue la validation. Ceci est utile si vous possédez un magasin physique.
Y or N
onsitePwd Si vous définissez un mot de passe, le personnel du magasin doit le saisir pour valider l’utilisation du coupon.
Les utilisateurs ne peuvent pas valider eux-mêmes le coupon.
string
memo Utilisé pour la gestion interne des coupons.
Les notes ne sont pas visibles des utilisateurs.
string
url Si vous saisissez une URL, un bouton « Utiliser le coupon » s’affichera sur la page du coupon et redirigera vers l’URL saisie lors du clic.
Si une image de coupon est téléchargée, cliquer sur l’image redirigera également vers l’URL.
string
useLimit Définissez le nombre maximum d’utilisations d’un coupon par personne.
Lors de l’utilisation de l’API REST de Vivoldi pour traiter l’utilisation des coupons, une valeur comprise entre 2 et 5 est requise.
Dans ce cas, l’identifiant utilisateur doit être renseigné.
Lors de la gestion manuelle sur le tableau de bord, vous pouvez choisir « Illimité » ou « 1 fois ».
Si vous choisissez « Illimité », n’importe qui peut utiliser le coupon sans limitation.
0 : Illimité, 1 : 1 fois, 2 : 2 fois, 3 : 3 fois, 4 : 4 fois, 5 : 5 fois
int
color Définit la couleur du texte du coupon sur la page du coupon.
Doit être saisie sous forme de valeur HEX jusqu’à 9 caractères, y compris la transparence.
Valeur par défaut : #4F4F4FFF
string
background Définit la couleur d’arrière-plan du coupon sur la page du coupon.
Doit être saisie sous forme de valeur HEX jusqu’à 9 caractères, y compris la transparence.
Valeur par défaut : #FFFFFFFF
string
userId Permet de gérer qui a reçu et utilisé le coupon.
Si la valeur pour l’utilisation maximale par personne est comprise entre 2 et 5, l’ID utilisateur est requis.
En général, saisissez l’identifiant de connexion du membre inscrit sur votre site.
string
userNm Si vous savez déjà qui recevra le coupon, saisissez le nom de l’utilisateur qui l’utilisera.
Ceci est nécessaire pour la gestion de l’émission et de l’utilisation des coupons.
string
userPhnno Renseignez les coordonnées de l’utilisateur qui utilisera le coupon. string
userEml Renseignez l’adresse e-mail de l’utilisateur qui utilisera le coupon. string
userEtc1 Indiquez des informations supplémentaires sur l’utilisateur à des fins administratives internes. string
userEtc2 Indiquez des informations supplémentaires sur l’utilisateur à des fins administratives internes. 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:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string

Supprimer le coupon

Cette API est disponible à partir du plan personnel.

Supprimer le coupon créé.
Pour supprimer plusieurs coupons à la fois, utilisez le tableau de bord.

Request:
Delete /api/coupon/v1/remove HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: -
Request:
DomainesDescription des champsDescriptionExigéeType
cpnNoCoupon number Le numéro du coupon à supprimer. 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:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string

Valider le coupon

Cette API est disponible à partir du plan personnel.

Utilisée pour vérifier et valider si le coupon est valide avant de traiter "Redeem coupon".
Vérifier la validation du coupon comme indiqué ci-dessous.
  • Valider la date d’expiration du coupon. (date de début et date d’expiration)
  • Valider le nombre maximum de coupons par personne.
  • Validez le remboursement du coupon.
Request:
Get /api/coupon/v1/validate HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request 항목 설명:
DomainesDescription des champsDescriptionExigéeType
cpnNoCoupon number Le numéro du coupon à valider.
Si la validation échoue, vérifiez le message dans la réponse.
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 항목 설명:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string

Utiliser le coupon

Cette API est disponible à partir du plan personnel.

Bien que vous puissiez gérer manuellement le traitement "racheter un coupon" dans la liste des coupons de votre tableau de bord, cette API vous permet de l’automatiser en l’appelant lorsqu’un utilisateur rachète un coupon sur votre site web.

Request:
Put /api/coupon/v1/use HTTP/1.1
Host: https://vivoldi.com
Authorization: APIKey {Your API Key}
Content-type: application/json
Request:
DomainesDescription des champsDescriptionExigéeType
cpnNoCoupon number Numéro de coupon « utilisé » à traiter.
Saisissez uniquement le numéro du coupon, sans le signe « - ».
string
onsitePwdOn-site coupon usage password Si un mot de passe a été défini pour l’utilisation en magasin, saisissez ce mot de passe.
Si le mot de passe est incorrect, vous ne pourrez pas utiliser le coupon.
string
userIdUser ID Permet de gérer qui a émis et qui a utilisé les coupons.
Si la valeur du nombre maximum d’utilisations par personne est comprise entre 2 et 5, l’ID utilisateur doit être renseigné.
En général, saisissez l’identifiant de connexion du membre inscrit sur votre site web.
string
memoNotes Vous pouvez saisir des notes pour gérer l’utilisation des coupons.
Indiquez l’adresse IP de l’utilisateur, la page et le service où le coupon a été utilisé, ainsi que toute autre information.
Lorsque le nombre maximal d’utilisations par personne est illimité, vous ne savez pas qui a utilisé le coupon, donc vous pouvez gérer par nom d’utilisateur ou note.
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:
DomainesDescriptionType
codeCode de réponse (0:Succès)int
messageLe message de réponse, ou un message connexe si le code de réponse est différent de zéro.string

Envoyer des messages push

Cette API est indépendante du service de raccourcissement d’URL de Vivoldi et est destinée à toute personne qui gère un site web.

Afin d’envoyer des messages push aux utilisateurs qui visitent votre site web, l’utilisateur doit accepter la "permission de notification" dans son navigateur web.
S’il refuse l’autorisation de notification, vous ne pourrez pas envoyer de messages push.

Après avoir installé le SDK JavaScript fourni par Vivoldi sur votre site web, le navigateur web affichera une fenêtre contextuelle pour les "autorisations de notification" lorsqu’un utilisateur visitera votre site web.
Si l’utilisateur accepte la permission, les données de notification seront répertoriées sur la page "Push Messages -> Send website push" du tableau de bord.
Par exemple, si 100 utilisateurs ont accepté les autorisations de notification sur votre site web, vous verrez 100 données dans la liste.
Lorsque vous envoyez un message push à partir du tableau de bord, le message est envoyé à tous les utilisateurs figurant dans la liste.

Tout le monde peut installer le SDK JavaScript fourni par Vivoldi pour collecter des données sur les utilisateurs.
Cependant, vous devez avoir de l’argent sur votre compte pour envoyer des messages push.
Le coût de l’envoi de messages push est de 10 KRW par message, ou vous pouvez souscrire à un abonnement mensuel pour envoyer un nombre illimité de messages.

L’installation du SDK JavaScript est aussi simple que de l’ajouter entre les <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>

Les clés API peuvent être créées sur la page "Developer API" dans votre tableau de bord, et publicKey peut être trouvé dans la liste une fois que vous avez enregistré votre domaine sur la page "Push Messages -> Domain Management".

Une fois que tout est prêt, la dernière chose à faire est de créer un nouveau fichier sw.min.js et de le télécharger à la racine de votre site web.
Par exemple : https://example.com/sw.min.js

Lorsque vous accédez au chemin ci-dessus, le script doit s’afficher dans le navigateur web pour que la notification fonctionne correctement.
Copiez et collez le code ci-dessous dans votre fichier sw.min.js nouvellement créé.

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)]));}});

Maintenant, lorsque vous accédez à votre site web, vous devriez voir l’autorisation de notification.
Lorsque vous avez autorisé la permission de notification, vérifiez si vous voyez des données de notification sur la page "Website Push Sending" de votre tableau de bord Vivoldi.