Démarrage rapide

API Revendeur

1. Créer une clé API

Connectez-vous au portail client sous "API Revendeur" et créez une clé. N'activez que les permissions dont vous avez réellement besoin (le défaut est en lecture seule). Le secret n'est affiché qu'une seule fois, stockez-le en lieu sûr dans votre gestionnaire de secrets.

2. Stocker les identifiants

Enregistrez la clé et le secret comme variables d'environnement. Jamais dans le code, jamais dans un dépôt.

# .env ou profil shell
export KH_KEY="kh_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
export KH_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

3. Envoyer votre première requête

Listez les produits disponibles. La signature est construite sur méthode, chemin, horodatage, nonce et empreinte du corps.

TS=$(date +%s)
NONCE=$(openssl rand -hex 16)
BODY_SHA256=$(printf '' | openssl dgst -sha256 -hex | awk '{print $2}')
SIG_INPUT=$(printf 'GET\n/v1/products\n%s\n%s\n%s' "$TS" "$NONCE" "$BODY_SHA256")
SIG=$(printf '%s' "$SIG_INPUT" | openssl dgst -sha256 -hmac "$KH_SECRET" -hex | awk '{print $2}')

curl https://www.kernelhost.com/cp/kh_reseller_api/v1/products \
  -H "KH-Key: $KH_KEY" \
  -H "KH-Timestamp: $TS" \
  -H "KH-Nonce: $NONCE" \
  -H "KH-Signature: $SIG"

4. Passer une commande

Important : POST /v1/orders exige un en-tête Idempotency-Key. Lors d'une nouvelle tentative réseau avec la même clé, vous recevez la même réponse, sans double commande.

BODY='{"product_id":42,"billing_cycle":"monthly"}'
BODY_SHA256=$(printf '%s' "$BODY" | openssl dgst -sha256 -hex | awk '{print $2}')
TS=$(date +%s)
NONCE=$(openssl rand -hex 16)
IDEM=$(openssl rand -hex 16)
SIG_INPUT=$(printf 'POST\n/v1/orders\n%s\n%s\n%s' "$TS" "$NONCE" "$BODY_SHA256")
SIG=$(printf '%s' "$SIG_INPUT" | openssl dgst -sha256 -hmac "$KH_SECRET" -hex | awk '{print $2}')

curl -X POST https://www.kernelhost.com/cp/kh_reseller_api/v1/orders \
  -H "KH-Key: $KH_KEY" \
  -H "KH-Timestamp: $TS" \
  -H "KH-Nonce: $NONCE" \
  -H "KH-Signature: $SIG" \
  -H "Idempotency-Key: $IDEM" \
  -H "Content-Type: application/json" \
  --data "$BODY"

5. Mettre en place un webhook (optionnel)

Enregistrez une URL HTTPS par clé pour recevoir les événements de manière asynchrone (order.paid, service.provisioned, invoice.created). La signature de la charge utile suit le schéma Stripe.