notpanel
ServicesTarifsFAQConcoursAPI
notpanel

Abonnés, likes et vues pour chaque plateforme.

Le catalogue combine des services opérés directement et la capacité de partenaires vérifiés. Disponibilité, délai, refill et drip-feed sont indiqués par service ; le routage et l’identité des partenaires restent confidentiels.

Produit

  • Services
  • Tarifs
  • Indice des prix
  • Programme d'affiliation

Ressources

  • API
  • Blog
  • FAQ
  • Statut

Entreprise

  • À propos
  • Pourquoi NotPanel
  • Nous contacter

Mentions légales

  • Conditions d'utilisation
  • Politique de confidentialité
  • Politique de remboursement

Langues

  • English
  • Español
  • Português
  • Русский
  • Türkçe
  • العربية
  • हिन्दी
  • Bahasa Indonesia
  • Français
  • 中文

© 2026 NotPanel. Tous droits réservés.

support@notpanel.com
notpanel
Documentation de l'API
+
Documentation de l'API

Introduction

  • Vue d'ensemble
  • Démarrage
  • Authentification
  • Limites de débit
  • Erreurs

Catalogue

  • Lister les services
  • Catalogue avancé
  • Types de service

Commandes

  • Passer une commande
  • Statut de commande
  • Devis de remboursement
  • Recomplément
  • Annuler

Compte

  • État du compte
  • Solde

Webhooks

  • Gérer les webhooks

Référence

  • Journal des modifications
  • SDK et bibliothèques

Besoin d'aide ?

support@notpanel.com →

Enregistrer un webhook

Abonne une URL publique aux événements pris en charge. Chaque endpoint reçoit son propre secret HMAC-SHA256, affiché une seule fois lors de sa création. S’il est perdu, supprimez l’endpoint puis ajoutez-le à nouveau.

POSThttps://notpanel.com/api/v3action=webhook.add
Clé d'API requiseDébit limité (compte partagé + IP + action)Corps : application/x-www-form-urlencoded
Maximum 5 webhooks par clé API. Utilisez une URL HTTPS accessible publiquement. Les destinations dangereuses, privées, de bouclage ou autrement non publiques sont rejetées.

Paramètres

NomTypeDescription
keyRequisstringVotre clé API.
actionRequisstringDoit être la chaîne littérale « webhook.add ».
urlRequisstring (URL)Endpoint HTTPS public qui recevra les POST. Doit être accessible depuis l'internet public.
eventsstring (CSV)Sous-ensemble séparé par des virgules des six événements pris en charge ci-dessous. Omettez-le pour vous abonner aux six.

Exemple de requête

Remplacez YOUR_API_KEY par la clé générée sur la page API de votre tableau de bord.

curl -X POST https://notpanel.com/api/v3 \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "key=YOUR_API_KEY&action=webhook.add&url=https://your-server.example.com/notpanel-webhook&events=order.completed,order.refunded"
const res = await fetch("https://notpanel.com/api/v3", {
  method: "POST",
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
  body: new URLSearchParams({
    key: "YOUR_API_KEY",
    action: "webhook.add",
    url: "https://your-server.example.com/notpanel-webhook",
    events: "order.completed,order.refunded",
  }),
});

const data = await res.json();
console.log(data);
import requests

res = requests.post(
  "https://notpanel.com/api/v3",
  data={
    "key": "YOUR_API_KEY",
    "action": "webhook.add",
    "url": "https://your-server.example.com/notpanel-webhook",
    "events": "order.completed,order.refunded",
},
)
print(res.json())
<?php
$body = http_build_query([
    'key' => 'YOUR_API_KEY',
    'action' => 'webhook.add',
    'url' => 'https://your-server.example.com/notpanel-webhook',
    'events' => 'order.completed,order.refunded',
]);

$response = file_get_contents('https://notpanel.com/api/v3', false, stream_context_create([
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-Type: application/x-www-form-urlencoded\r\n",
        'content' => $body,
        'ignore_errors' => true,
    ],
]));

print_r(json_decode($response, true));

Exemple de réponse

{
  "webhook_id": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
  "url": "https://your-server.example.com/notpanel-webhook",
  "secret": "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
  "events": [
    "order.completed",
    "order.refunded"
  ]
}

Erreurs courantes

StatutCorpsCause
400{"error":"Maximum 5 webhook endpoints per API key"}Les endpoints existants ont épuisé le plafond. Supprimez d'abord un endpoint inutilisé avec action=webhook.remove.
400{"error":"Webhook URL must be a publicly reachable HTTPS URL"}L’URL n’était pas une adresse HTTPS valide, n’a pas pu être analysée ou s’est résolue en une IP privée/de boucle locale.
400{"error":"Webhook event is invalid","error_code":"INVALID_WEBHOOK_EVENT"}Le nom de l'événement ne figure pas sur la liste d'autorisation. Vérifiez l'orthographe — les noms utilisent la forme « order.<status> ».

Événements disponibles

  • order.completed
  • order.partial
  • order.processing
  • order.in_progress
  • order.refunded
  • order.refill_completed

Lister les webhooks

action=webhook.list renvoie chaque endpoint enregistré sous la clé appelante, y compris son état de livraison (status, failureCount, lastDeliveredAt).

key=YOUR_API_KEY&action=webhook.list
[
  {
    "id": "3f2504e0-4f89-41d3-9a0c-0305e82c3301",
    "url": "https://your-server.example.com/notpanel-webhook",
    "events": ["order.completed", "order.refunded"],
    "status": "active",
    "failureCount": 0,
    "lastDeliveredAt": "2026-04-30T15:42:11.000Z",
    "createdAt": "2026-04-15T09:01:00.000Z"
  }
]

Supprimer un webhook

action=webhook.remove avec l’UUID de l’endpoint supprime l’endpoint et révoque son secret de signature. Une livraison déjà en cours peut encore arriver ; aucun nouvel événement ne sera mis en file pour lui.

key=YOUR_API_KEY&action=webhook.remove&id=3f2504e0-4f89-41d3-9a0c-0305e82c3301

{
  "success": true
}

Charge utile de livraison

Chaque livraison est un POST avec Content-Type: application/json. Le corps contient events, timestamp et deliveryId. Les paramètres publics actuels regroupent pendant 5 secondes au maximum et incluent au plus 50 événements, chacun avec un id logique stable, event, timestamp et data. La file ou une panne peut ajouter du délai : ce n’est pas une promesse de livraison en 5 secondes. En-têtes :

  • X-Webhook-Signature — sha256=&lt;hex&gt;, calculée sur &lt;timestamp&gt;.&lt;octets exacts du corps JSON&gt;.
  • X-Webhook-Timestamp — horodatage Unix de la livraison, en secondes.
  • X-Webhook-Delivery-Id — UUID du lot, réutilisé lors d’une nouvelle tentative du même lot. Il n’existe pas d’en-tête d’événement au niveau de la livraison ; lisez chaque événement dans le corps.
{
  "events": [
    {
      "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
      "event": "order.completed",
      "timestamp": 1777534931,
      "data": {
        "order": 7001,
        "orderId": 7001,
        "serviceId": 1,
        "status": "Completed",
        "status_key": "completed",
        "charge": "0.50",
        "startCount": 1234,
        "remains": 0
      }
    }
  ],
  "timestamp": 1777534931,
  "deliveryId": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}

Vérifier les signatures

Lisez X-Webhook-Timestamp et les octets JSON exacts reçus. Calculez HMAC-SHA256 sur &lt;timestamp&gt;.&lt;body bytes&gt; avec le secret, formatez en sha256=&lt;hex&gt; et comparez à X-Webhook-Signature en temps constant. Une nouvelle tentative conserve les IDs d’événement et deliveryId, mais reçoit un nouvel horodatage, corps et signature.

Dans le cadre de votre propre politique anti-rejeu, vous pouvez rejeter une livraison correctement signée si son horodatage diffère de l’horloge de votre serveur de plus de 5 minutes.

Comportement de livraison et nouvelles tentatives

  • Livraison au mieux avec nouvelles tentatives. Une réponse 2xx termine une livraison. Chaque tentative expire après 30 secondes. Les échecs peuvent être retentés à partir de 5 secondes avec un délai exponentiel plafonné à 5 minutes, mais il ne s’agit pas d’une garantie durable de livraison au moins une fois.
  • Seuil de mise en pause. L’endpoint est mis en pause après 10 tentatives consécutives échouées. Il n’existe aucune action d’activation ou de mise à jour : supprimez-le, enregistrez un remplacement avec action=webhook.add, puis conservez le nouveau secret affiché.
  • L’ordre n’est pas garanti. Gardez des gestionnaires idempotents, traitez chaque événement du lot, dédupliquez une transition logique par l’id de l’événement ou un lot retenté par deliveryId, puis rapprochez les états importants avec action=status.