Aller au contenu

Beepclick / Vos liens vont plus loin

Développez avec Beepclick.

Liens, événements de conversion et webhooks signés.

Premiers pas

Créez une clé dans votre espace. Conservez les clés sk_ sur votre serveur. Pro : 60 requêtes/minute. Elite : 600. read autorise les lectures, write les modifications de liens, events l’ingestion serveur.

Gérer les clésOpenAPI 3.1 (JSON)

Routes disponibles : GET/POST /v1/links, GET/PATCH/DELETE /v1/links/{id}, GET /v1/links/{id}/stats, POST /v1/events, GET /v1/conversions/analytics. Les autres routes de l’espace exigent une session.

La pagination utilise limit et nextCursor. Les mutations acceptent Idempotency-Key pendant 24 heures. Une réutilisation pour une requête différente renvoie 409. Les réponses 429 incluent Retry-After. Les erreurs utilisent application/problem+json avec un code stable.

JavaScript

const response = await fetch('https://beepclick.app/v1/links', {
  method: 'POST',
  headers: {Authorization: 'Bearer ' + process.env.BEEP_API_KEY,
    'Content-Type': 'application/json', 'Idempotency-Key': 'order-123-link'},
  body: JSON.stringify({destination: 'https://example.com/offer'})
});
console.log(await response.json());

Python

import os, requests
response = requests.post('https://beepclick.app/v1/links',
  headers={'Authorization': 'Bearer ' + os.environ['BEEP_API_KEY'],
           'Idempotency-Key': 'order-123-link'},
  json={'destination': 'https://example.com/offer'})
response.raise_for_status()
print(response.json())

PHP

<?php
$ch = curl_init('https://beepclick.app/v1/links');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer '.getenv('BEEP_API_KEY'),
    'Content-Type: application/json', 'Idempotency-Key: order-123-link'],
  CURLOPT_POSTFIELDS => json_encode(['destination' => 'https://example.com/offer'])]);
echo curl_exec($ch);
curl_close($ch);

beep.js & consentement

<script>window.beep=window.beep||function(){(window.beep.q=window.beep.q||[]).push(arguments)};</script>
<script defer src="https://beepclick.app/beep.js" data-key="pk_YOUR_PUBLIC_KEY"></script>
// Only after explicit consent from your CMP:
beep('consent', true);
beep('track', 'sale', {value: 49, currency: 'EUR'});
// Withdrawal:
beep('consent', false);

Les clés publiques collectent uniquement depuis les origines exactes autorisées. Par défaut, les pages vues sont anonymes et sans cookie. Ajoutez data-cookieless="true" pour forcer ce mode. Le consentement n’est jamais implicite. lead, sale, signup, subscription et custom:nom exigent un consentement. Activez le suivi séparément pour chaque lien.

{
  "eventId": "a1b2c3d4-0000-4000-8000-000000000001",
  "name": "sale",
  "cid": "SIGNED_BEEP_CID",
  "visitor": "your-consented-visitor-id",
  "value": 49,
  "currency": "EUR",
  "consent": true
}

Envoyez ce JSON à POST /v1/events avec une clé serveur de portée events. Réutilisez eventId lors des reprises. Les montants sont regroupés par devise et ne sont jamais additionnés entre devises.

Vérifier les signatures de webhooks

Beepclick-Signature contient t=UNIX_SECONDS,v1=HMAC_HEX. Calculez HMAC-SHA256 avec le secret whsec_ sur timestamp + '.' + le corps exact. Comparez en temps constant, refusez les horodatages de plus de 5 minutes et dédupliquez l’identifiant d’événement. La livraison peut être répétée : huit tentatives avec attente exponentielle. Les redirections 3xx ne sont pas suivies.

import {createHmac, timingSafeEqual} from 'node:crypto';
const expected = createHmac('sha256', process.env.BEEP_WEBHOOK_SECRET)
  .update(timestamp + '.' + rawBody).digest();
const received = Buffer.from(signatureHex, 'hex');
const valid = received.length === expected.length &&
  timingSafeEqual(received, expected) &&
  Math.abs(Date.now()/1000 - Number(timestamp)) < 300;