SDKs officiels

Clients typés sur l'REST API pour les cinq langages les plus demandés. Chacun embarque l'auth par bearer token, la relance avec backoff exponentiel sur 429 et 5xx, et un helper verifyWebhookSignature pour la vérification HMAC-SHA256 du header X-Abundera-Signature. Licence MIT.

Source de vérité : /docs/openapi.json · Problèmes : support@abundera.ai

TS

TypeScript / Node

@abundera/qr-pro

Node 18+. Zéro dépendance runtime. Builds ESM et CJS.

Installation

npm install @abundera/qr-pro

Créer un code

import { AbunderaQRProClient } from "@abundera/qr-pro";

const client = new AbunderaQRProClient({
  apiKey: process.env.ABUNDERA_API_KEY!,
});

const code = await client.createCode({
  destination_url: "https://example.com/launch",
  label: "Spring launch poster",
});

console.log(code.short_url);

Vérifier un webhook

import { verifyWebhookSignature } from "@abundera/qr-pro";

verifyWebhookSignature({
  signature: req.headers["x-abundera-signature"],
  body: rawBody,
  secret: process.env.ABUNDERA_WEBHOOK_SECRET!,
});
// lève une erreur en cas de mauvaise signature / dérive temporelle, corps utilisable après cette ligne

Source sur GitHub →

Py

Python

abundera-qr-pro

Python 3.9+. Une seule dépendance (httpx). Clients synchrone et asynchrone.

Installation

pip install abundera-qr-pro

Créer un code

from abundera_qr_pro import Client

with Client(api_key="abnd_qrpro_...") as c:
    code = c.create_code(
        destination_url="https://example.com/launch",
        label="Spring launch poster",
    )
    print(code.short_url)

Vérifier un webhook

from abundera_qr_pro import verify_webhook_signature
from abundera_qr_pro.webhook import WebhookVerificationError

try:
    verify_webhook_signature(
        signature=request.headers["X-Abundera-Signature"],
        body=request.body,
        secret=os.environ["ABUNDERA_WEBHOOK_SECRET"],
    )
except WebhookVerificationError:
    return "", 400

Source sur GitHub →

Go

Go

github.com/abundera/qr-pro-go

Go 1.21+. Bibliothèque standard uniquement. Context-aware partout.

Installation

go get github.com/abundera/qr-pro-go

Créer un code

import qrpro "github.com/abundera/qr-pro-go"

c, _ := qrpro.New(os.Getenv("ABUNDERA_API_KEY"))
ctx := context.Background()

code, err := c.CreateCode(ctx, qrpro.CodeCreate{
    DestinationURL: "https://example.com/launch",
    Label:          "Spring launch poster",
})
if err != nil { log.Fatal(err) }
fmt.Println(code.ShortURL)

Vérifier un webhook

if err := qrpro.VerifyWebhookSignature(
    r.Header.Get("X-Abundera-Signature"),
    body,
    os.Getenv("ABUNDERA_WEBHOOK_SECRET"),
    0, // tolérance par défaut 300s
); err != nil {
    http.Error(w, "bad signature", http.StatusBadRequest)
    return
}

Source sur GitHub →

Rb

Ruby

abundera-qr-pro

Ruby 3.0+. Basé sur Faraday. Compatible avec les initialiseurs Rails.

Installation

gem install abundera-qr-pro
# ou dans le Gemfile
gem "abundera-qr-pro"

Créer un code

require "abundera/qr_pro"

client = Abundera::QRPro::Client.new(api_key: ENV.fetch("ABUNDERA_API_KEY"))

code = client.create_code(
  destination_url: "https://example.com/launch",
  label: "Spring launch poster",
)

puts code.short_url

Vérifier un webhook

require "abundera/qr_pro/webhook"

begin
  Abundera::QRPro::Webhook.verify!(
    signature: request.headers["X-Abundera-Signature"],
    body: request.raw_post,
    secret: ENV.fetch("ABUNDERA_WEBHOOK_SECRET"),
  )
rescue Abundera::QRPro::Webhook::InvalidSignature
  head :bad_request
end

Source sur GitHub →

PHP

PHP

abundera/qr-pro

PHP 8.1+. Compatible avec tout client HTTP PSR-18 (Guzzle par défaut). Les service providers Laravel et Symfony sont inclus dans le même paquet.

Installation

composer require abundera/qr-pro

Créer un code

use Abundera\QrPro\Client;

$client = new Client(apiKey: getenv('ABUNDERA_API_KEY'));

$code = $client->createCode(
    destinationUrl: 'https://example.com/launch',
    label: 'Spring launch poster',
);

echo $code->shortUrl;

Vérifier un webhook

use Abundera\QrPro\Webhook;
use Abundera\QrPro\WebhookException;

try {
    Webhook::verify(
        signature: $_SERVER['HTTP_X_ABUNDERA_SIGNATURE'] ?? '',
        body: file_get_contents('php://input'),
        secret: getenv('ABUNDERA_WEBHOOK_SECRET'),
    );
} catch (WebhookException $e) {
    http_response_code(400);
    exit;
}

Source sur GitHub →

Ce que couvre chaque SDK

  • Codesliste, récupération, création, mise à jour, suppression, vérification de slug, import.
  • Analyticsexports JSON et CSV avec filtres de date from/to.
  • Groupsliste, création, suppression, affectation de codes.
  • Webhooksliste, création (avec secret), suppression, plus un helper de vérification de signature.
  • User/me, export de compte.

Les endpoints Admin, Stripe-webhook et infrastructure sont intentionnellement hors périmètre pour les SDKs — ils sont service-to-service uniquement. La liste complète des endpoints se trouve dans la spec OpenAPI 3.1.

Collection Postman

Import en un clic dans Postman ou Insomnia : /docs/postman.json (régénérée depuis la spec OpenAPI à chaque déploiement). Chaque requête est préconfigurée avec le template de header d'auth par bearer token — définissez votre clé API une fois au niveau de la collection et chaque endpoint en hérite.

Vous préférez le OpenAPI brut ? Postman supporte OpenAPI 3.1 nativement : File → Import → Link, puis collez https://pro.qr.abundera.ai/docs/openapi.json.

Politique de versionnage

Les SDKs suivent SemVer et sont versionnés indépendamment de l'API. Un correctif SDK (0.1.0 → 0.1.1) ne modifie pas la version de l'API. Un changement additif de l'API (nouvel endpoint, nouveau champ optionnel) n'impose pas un bump majeur de SDK.

  • Patch SDK (0.1.x) — correctif, documentation, pas de changement d'API publique. Mise à jour automatique sûre.
  • Mineur SDK (0.x.0) — nouvelles méthodes couvrant de nouveaux endpoints API, ou ajouts ergonomiques. Rétrocompatible.
  • Majeur SDK (1.0.0 → 2.0.0) — renommage, suppression, changement de forme de type. Uniquement lors d'une majeure API, ou pour corriger un bug ergonomique SDK persistant impossible à livrer en mineur.

Versionnage API. Le préfixe URL est la version majeure. Aujourd'hui : /api/... (v1). Un changement cassant est livré en /api/v2/..., avec v1 maintenu au moins 12 mois et les headers de réponse Deprecation + Sunset tout au long de la fenêtre de dépréciation. Définition complète de “cassant” sur /docs/changelog/.

Fenêtre de support. Le dernier mineur sur le majeur actuel reçoit les corrections de sécurité. Les majeurs plus anciens reçoivent des correctifs de sécurité sur demande pour les clients Pro payants.

Exemples d'applications

Applications minimales exécutables montrant la création de code, la mise à jour de destination, la lecture d'analytics et la vérification de signature de webhook :

  • node-express — TypeScript + Express, endpoint webhook avec protection contre le rejeu.
  • fastapi — Python 3.11 + FastAPI, helper de vérification de signature intégré.
  • gin — Go 1.21 + Gin, pattern de handler idiomatique.
  • rails — Rails 7 + Sidekiq, handler webhook en job.
  • laravel — Laravel 11, contrôleur webhook avec route signée.

Chaque exemple est testé en CI contre une API mockée. Clonez, définissez ABUNDERA_API_KEY et ABUNDERA_WEBHOOK_SECRET, lancez.

Votre langage n'est pas là ?

La spec OpenAPI 3.1 est la source de vérité. Générez un client dans n'importe quel langage avec openapi-generator, ou écrivez un wrapper léger vous-même — l'API est petite (six ressources principales, auth bearer token). Si vous souhaitez un SDK officiel pour un langage non couvert, écrivez à support@abundera.ai.