API v3

Documents API

Référence API pour SMM Africa. Vérifiez les soldes, récupérez les services, passez des commandes et suivez l'état à partir d'un seul point de terminaison.

URL de basehttps://smm.africa/api/v3
FormaterPOST · JSON ou champs de formulaire · Réponse JSON
Votre clé APIÉmise par compte. Retirez-le du compte une fois connecté.
Connectez-vous pour obtenir votre clé

Commencez par une vérification du solde

Une demande de solde est le moyen le plus rapide de confirmer votre clé, le format de la demande et les allers-retours d'intégration avant de commencer à passer des commandes.

POST /api/v3 · balance
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "balance"
}'
HTTP 200 · balance
{
  "balance": "100.84",
  "currency": "USD"
}

Authentification

Envoyez la clé API de votre compte soit dans Autorisation : Porteur YOUR_API_KEY, soit dans le champ de demande de clé.Choisissez une méthode ;le champ clé fonctionne avec les panels de revendeurs courants.Conservez les clés dans les variables d'environnement côté serveur et faites-les pivoter à partir du compte.

Toutes les actions utilisent POST https://smm.africa/api/v3. Corps pris en charge : application/json, application/x-www-form-urlencoded et multipart/form-data avec des champs de texte uniquement. Les réponses sont JSON. Le champ d'action sélectionne l'opération.

curl · form authentication
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  --data-urlencode "key=YOUR_API_KEY" \
  --data-urlencode "action=balance"

Tous les soldes, frais et montants de commande de la v3 sont retournés en USD pour des raisons de compatibilité.

De la connexion API à votre première commande

Suivez ces étapes à votre rythme. Ce guide n'envoie jamais de commande et ne débite jamais votre portefeuille.

1 / 6 · Connect your account

Open your account and obtain your API key. Keep it on your server. Use the balance example to check authentication without creating a paid order.

Open connection example

Votre première commande revendeur

Pourquoi les paiements de mes clients sont-ils séparés de mon portefeuille SMM.Africa ?

Votre client paie votre entreprise selon vos propres modalités. Votre portefeuille SMM.Africa paie les commandes que vous soumettez ici. L'encaissement d'un paiement client ne finance pas automatiquement ce portefeuille, et un remboursement de portefeuille ne rembourse pas automatiquement votre client. Rapprochez les deux enregistrements séparément, y compris les frais et tout remboursement client approuvé.

Ouvrir cette réponse
Comment dois-je passer ma première commande d'API revendeur ?

Commencez par les exemples d'authentification et d'équilibre de l'API, puis examinez le service, le format cible, les limites et le prix. Utilisez un objectif que vous contrôlez et une quantité dans les limites indiquées. L'action d'ajout dépense le solde du portefeuille. Enregistrez l'ID de commande retournée et vérifiez son statut. Lisez la documentation actuelle de l'API avant de choisir une stratégie de nouvelle tentative.

Ouvrir cette réponse
Dois-je envoyer une autre commande d'API si la première requête expire ?

Vérifiez d'abord si la demande d'origine a créé une commande. Un délai d'attente peut laisser le résultat incertain même si le traitement a réussi. Conservez la référence de la demande et tout ID de commande, et utilisez le mécanisme d'idempotence documenté lorsqu'il est pris en charge. Ne générez pas de nouvelle demande payante simplement parce que la première réponse manquait ; contactez l'assistance si le résultat reste incertain.

Ouvrir cette réponse

Lire le guide complet

Référence

Référence complète des points de terminaison

Examinez les paramètres de demande, les exemples de réponses et le comportement exact de chaque pris en charge. action.

balance

Vérifiez le solde du portefeuille lié à la clé API du revendeur authentifié.

POST
POST /api/v3 · balance
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "balance"
}'

Demande paramètres

ParamètreTaperObligatoireDescription & contraintes
keystringConditionnelVotre clé API, utilisée pour authentifier la demande. Obligatoire uniquement lorsque Autorisation : Le porteur est absent.
actionstringOuibalance Utilisez la valeur d'action exacte indiquée.

Exemple de réponse

HTTP 200 · balance
{
  "balance": "100.84",
  "currency": "USD"
}

Tous les soldes, frais et montants de commande de la v3 sont retournés en USD pour des raisons de compatibilité.

Exemple de réponse d'erreur

HTTP 400 · balance
{
  "error": "Invalid API key",
  "code": "INVALID_API_KEY",
  "request_id": "request-123",
  "retryable": false
}

services

Récupérez le catalogue de services SMM Africa en direct avec les identifiants de service, les prix, les limites et les indicateurs de recharge ou d'annulation.

POST
POST /api/v3 · services
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "services"
}'

Demande paramètres

ParamètreTaperObligatoireDescription & contraintes
keystringConditionnelVotre clé API, utilisée pour authentifier la demande. Obligatoire uniquement lorsque Autorisation : Le porteur est absent.
actionstringOuiservices Utilisez la valeur d'action exacte indiquée.

Exemple de réponse

HTTP 200 · services
[
  {
    "service": 1,
    "name": "Service Name",
    "type": "Default",
    "rate": "0.90",
    "min": "50",
    "max": "10000",
    "category": "First Category",
    "description": "Start: 2 mins | Speed: 1000/day",
    "refill": true,
    "cancel": true,
    "drop_rate": "Almost No",
    "start_time": "2 mins",
    "speed": "1000/day",
    "reliability": "Poor"
  }
]

Récupérez le catalogue en direct avant de commander car les ID de service, les tarifs, les limites et la disponibilité peuvent changer.

Exemple de réponse d'erreur

HTTP 400 · services
{
  "error": "Invalid API key",
  "code": "INVALID_API_KEY",
  "request_id": "request-123",
  "retryable": false
}

add

Passez une nouvelle commande de croissance des médias sociaux avec l'identifiant de service, le lien cible et quantité.

POST
POST /api/v3 · add
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "add",
  "service": 1234,
  "link": "https://instagram.com/your-profile",
  "quantity": 500,
  "max_charge": 5,
  "idempotency_key": "order-unique-001"
}'

Demande paramètres

ParamètreTaperObligatoireDescription & contraintes
keystringConditionnelVotre clé API, utilisée pour authentifier la demande. Obligatoire uniquement lorsque Autorisation : Le porteur est absent.
actionstringOuiadd Utilisez la valeur d'action exacte indiquée.
serviceintegerOuiL'ID du service que vous souhaitez commander. Utilisez un identifiant de la réponse actuelle des services ; son type détermine les champs ci-dessous.
linkstringConditionnelL'URL du profil, de la publication ou du contenu cible. Requis pour le type de service sélectionné ; fournissez l’URL cible.
quantityintegerConditionnelLa quantité que vous souhaitez commander. Doit satisfaire aux exigences min et max du service sélectionné. Omettre lorsque son type n'accepte pas la quantité.
max_chargenumber / decimal stringNoOptional maximum USD charge, including discounts, with up to six decimal places. PRICE_LIMIT_EXCEEDED (409) creates no order or debit. Changing a ceiling changes request intent. Montant maximal autorisé en USD, avec au plus six décimales.
idempotency_keystringRecommandéUse one unique value per logical order. If the request times out without a response, retry with the same value so the order cannot be charged twice. Conserver une valeur unique par ordre logique ; réutiliser uniquement avec une charge utile de nouvelle tentative identique.
Champs par type de service

Sélectionnez le type renvoyé par les services ; n’envoyez pas de champ de type distinct. Les valeurs de liste sont du texte séparé par une nouvelle ligne, y compris en JSON. L'API dérive la quantité facturable pour les commentaires, les listes personnalisées, les packages et les abonnements, puis vérifie les limites du service.

Type de serviceChamps obligatoiresChamps optionnels / contraintes
Defaultlink, quantityURL cible standard et quantité demandée.
PackagelinkAucune quantité.
SEOlink, quantity, keywordsMettez un mot-clé sur chaque ligne.
Custom Commentslink, commentsUn commentaire par ligne ; le nombre de commentaires est la quantité commandée.
Custom Comments Packagelink, commentsUn commentaire par ligne ; pas de quantité.
Comment Replieslink, username, commentsusername est le propriétaire du commentaire ; mettez une réponse par ligne.
Comment Likeslink, usernamele nom d'utilisateur est le propriétaire du commentaire ; pas de quantité.
Mentionslink, quantity, usernamesMettez un nom d'utilisateur par ligne.
Mentions with Hashtagslink, quantity, usernames, hashtagsMettez les noms d'utilisateur et les hashtags sur des lignes séparées.
Mentions Custom Listlink, usernamesMettez un nom d'utilisateur par ligne ; pas de quantité.
Mentions Hashtaglink, quantity, hashtagsMettez un hashtag par ligne.
Mentions User Followerslink, quantity, usernameLe nom d'utilisateur est l'URL du profil source à récupérer.
Mentions Media Likerslink, quantity, mediamedia est l'URL du média source à récupérer.
Polllink, quantity, answerLa réponse est le texte exact de l'option de sondage attendu par le fournisseur.
Invites from Groupslink, quantity, groupsMettez un groupe sur chaque ligne.
Web Trafficlink, quantity, country, device, type_of_trafficL'appareil est mobile ou de bureau. type_of_traffic est 1 (nécessite google_keyword), 2 (nécessite Refer_url) ou 3.
Champs d’attribution facultatifs
ParamètreTaperObligatoireDescription & contraintes
goal_keystringNoClé d'objectif facultative pour l'attribution à croissance guidée. Métadonnées d'attribution facultatives.
recommendation_tierstringNoNiveau de recommandation facultatif. Métadonnées d'attribution facultatives.
user_intent_labelstringNoÉtiquette facultative décrivant le l'intention de l'utilisateur. Métadonnées d'attribution facultatives.
source_flowstringNoIdentifiant facultatif du flux qui a créé la commande. Métadonnées d'attribution facultatives.

Exemple de réponse

HTTP 200 · add
{
  "order": 1000000,
  "charged": 5.85,
  "queued": true
}

Stockez l'ID de commande retourné et vérifiez l'état avant réessayer une demande d'ajout.

Exemple de réponse d'erreur

HTTP 400 · add
{
  "error": "Invalid API key",
  "code": "INVALID_API_KEY",
  "request_id": "request-123",
  "retryable": false
}

status

Interrogez une commande par ID pour lire l'état de livraison, le nombre de départ, les restes et les détails de facturation.

POST
POST /api/v3 · status
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "status",
  "orders": [
    "1000000",
    "1000001"
  ]
}'

Demande paramètres

ParamètreTaperObligatoireDescription & contraintes
keystringConditionnelVotre clé API, utilisée pour authentifier la demande. Obligatoire uniquement lorsque Autorisation : Le porteur est absent.
actionstringOuistatus Utilisez la valeur d'action exacte indiquée.
orderinteger / stringOuiL'ID de commande SMM Africa renvoyé par add. Conserve l'ID de commande renvoyé par add ; ne remplacez pas un numéro de commande de fournisseur.
ordersarray / stringConditionnelFor bulk status, send 1–20 IDs as a JSON array or comma-separated form string instead of order. Inspect each item's http_status and retry_after. Utilisez order ou orders, jamais les deux. Chaque élément groupé possède son propre http_status.

Exemple de réponse

HTTP 200 · status
{
  "orders": [
    {
      "order": 1000000,
      "status": "processing",
      "start_count": 3572,
      "remains": 157,
      "charge": 0.27819,
      "updated_at": "2026-10-15T12:00:00Z",
      "freshness": "fresh",
      "reason_code": null,
      "retryable": false,
      "automatic_retry": false,
      "can_cancel": false,
      "funds_state": "captured",
      "next_retry_at": null,
      "refund_deadline_at": null,
      "http_status": 200
    },
    {
      "order": "1000001",
      "http_status": 400,
      "error": "Order not found",
      "code": "ORDER_NOT_FOUND",
      "request_id": "request-123",
      "retryable": false
    }
  ]
}

Sondez les statuts par lots et laissez un court délai entre les demandes.

Exemple de réponse d'erreur

HTTP 400 · status
{
  "error": "Order not found",
  "code": "ORDER_NOT_FOUND",
  "request_id": "request-123",
  "retryable": false
}

refill

Demander une recharge pour une commande éligible dans la fenêtre de recharge publiée.

POST
POST /api/v3 · refill
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "refill",
  "order": 1000000,
  "idempotency_key": "refill-unique-001"
}'

Demande paramètres

ParamètreTaperObligatoireDescription & contraintes
keystringConditionnelVotre clé API, utilisée pour authentifier la demande. Obligatoire uniquement lorsque Autorisation : Le porteur est absent.
actionstringOuirefill Utilisez la valeur d'action exacte indiquée.
orderinteger / stringOuiL'ID de commande SMM Africa renvoyé par add. Conserve l'ID de commande renvoyé par add ; ne remplacez pas un numéro de commande de fournisseur.

Exemple de réponse

HTTP 200 · refill
{
  "order": 1000000,
  "success": "Refill request accepted."
}

La recharge est disponible uniquement pour les commandes éligibles dans la fenêtre de recharge publiée par le service.

Exemple de réponse d'erreur

HTTP 400 · refill
{
  "error": "Invalid API key",
  "code": "INVALID_API_KEY",
  "request_id": "request-123",
  "retryable": false
}

cancel

Demander l'annulation d'une commande pour laquelle le service sélectionné prend en charge l'annulation.

POST
POST /api/v3 · cancel
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "cancel",
  "order": 1000000,
  "idempotency_key": "cancel-unique-001"
}'

Demande paramètres

ParamètreTaperObligatoireDescription & contraintes
keystringConditionnelVotre clé API, utilisée pour authentifier la demande. Obligatoire uniquement lorsque Autorisation : Le porteur est absent.
actionstringOuicancel Utilisez la valeur d'action exacte indiquée.
orderinteger / stringOuiL'ID de commande SMM Africa renvoyé par add. Conserve l'ID de commande renvoyé par add ; ne remplacez pas un numéro de commande de fournisseur.

Exemple de réponse

HTTP 200 · cancel
{
  "order": 1000000,
  "success": "Cancellation request accepted."
}

L'annulation est disponible uniquement lorsque le service sélectionné le prend en charge.

Exemple de réponse d'erreur

HTTP 400 · cancel
{
  "error": "Invalid API key",
  "code": "INVALID_API_KEY",
  "request_id": "request-123",
  "retryable": false
}

Créer et tester votre intégration

Vérifiez le solde, récupérez les services, choisissez leur type, conservez un identifiant d’opération, envoyez la commande, enregistrez son identifiant, puis consultez son statut. Les prix sont en USD, pour 1 000 unités ou par forfait selon le service. Traitez les identifiants comme des chaînes opaques. Les chaînes décimales et les champs monétaires numériques conservent leurs types ; les frais utilisent une précision de six décimales en USD.

Les clients Node.js et PHP 3.3 conservent les clés d’opération et les réponses réussies, respectent Retry-After et arrêtent les mutations non résolues avant la fin du délai de rejeu de 24 heures. Gardez cet état privé, persistant et distinct pour chaque compte. Testez d’abord avec l’environnement local, sans connexion aux portefeuilles ni aux fournisseurs réels.

Node.js 3.3 · PHP 3.3 · Environnement de test · Guide d’intégration · Vérificateur de signature webhook

Local sandbox · Node 22+
node sandbox.mjs
# Endpoint: http://127.0.0.1:4013/api/v3
# Key: sandbox_test_key (never use a live key)

subscription_create

Créer un abonnement plafonné sans débit. Utilisez un service pour URL de publication, une quantité entière positive, USD, spending_cap avec six décimales au maximum, max_posts (1–10000) et une clé d’idempotence conservée.

POST /api/v3 · subscription_create
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "subscription_create",
  "service": 1234,
  "quantity": 500,
  "currency": "USD",
  "spending_cap": 25,
  "max_posts": 10,
  "idempotency_key": "campaign-unique-001"
}'
HTTP 200 · subscription_create
{
  "subscription": {
    "id": "YOUR_SUBSCRIPTION_ID",
    "service_id": "1234",
    "quantity": 500,
    "currency": "USD",
    "spending_cap": "25.000000",
    "spent": "0.000000",
    "max_posts": 10,
    "post_count": 0,
    "state": "active",
    "pause_reason": null
  }
}

subscription_post

Envoyer l’URL d’une publication découverte. Le service et la quantité proviennent de l’abonnement. max_charge limite facultativement le coût de cette publication en USD. Une URL canonique répétée renvoie la commande originale, même après annulation.

POST /api/v3 · subscription_post
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "subscription_post",
  "subscription": "YOUR_SUBSCRIPTION_ID",
  "link": "https://example.com/post/123",
  "max_charge": 5,
  "idempotency_key": "post-unique-001"
}'
HTTP 200 · subscription_post
{
  "order": "1000000",
  "charged": 0.5,
  "queued": true
}

subscription_status

Lisez les paramètres et envoyez jusqu'à 20 reçus. Passez after=next_cursor pour les pages suivantes. Interroger les ID de commande de reçu en utilisant le statut groupé.

POST /api/v3 · subscription_status
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "subscription_status",
  "subscription": "YOUR_SUBSCRIPTION_ID"
}'
HTTP 200 · subscription_status
{
  "subscription": {
    "id": "YOUR_SUBSCRIPTION_ID",
    "service_id": "1234",
    "quantity": 500,
    "currency": "USD",
    "spending_cap": "25.000000",
    "spent": "0.000000",
    "max_posts": 10,
    "post_count": 0,
    "state": "active",
    "pause_reason": null
  },
  "posts": [
    {
      "post_key": "opaque-cursor",
      "order_id": "1000000",
      "charged": "0.500000",
      "created_at": "2026-10-15T12:00:00Z"
    }
  ],
  "next_cursor": null
}

subscription_pause

Suspendre les futurs envois de publications. Les commandes existantes continuent.

POST /api/v3 · subscription_pause
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "subscription_pause",
  "subscription": "YOUR_SUBSCRIPTION_ID"
}'
HTTP 200 · subscription_pause
{
  "subscription": {
    "id": "YOUR_SUBSCRIPTION_ID",
    "service_id": "1234",
    "quantity": 500,
    "currency": "USD",
    "spending_cap": "25.000000",
    "spent": "0.000000",
    "max_posts": 10,
    "post_count": 0,
    "state": "paused",
    "pause_reason": null
  }
}

subscription_resume

Reprendre un abonnement suspendu après approvisionnement. Les abonnements terminés ou annulés ne peuvent pas reprendre.

POST /api/v3 · subscription_resume
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "subscription_resume",
  "subscription": "YOUR_SUBSCRIPTION_ID"
}'
HTTP 200 · subscription_resume
{
  "subscription": {
    "id": "YOUR_SUBSCRIPTION_ID",
    "service_id": "1234",
    "quantity": 500,
    "currency": "USD",
    "spending_cap": "25.000000",
    "spent": "0.000000",
    "max_posts": 10,
    "post_count": 0,
    "state": "active",
    "pause_reason": null
  }
}

subscription_cancel

Arrêter définitivement les futures publications. Les commandes existantes doivent être annulées individuellement si elles sont encore admissibles. Les remboursements ne reconstituent pas le plafond de dépenses de l’abonnement.

POST /api/v3 · subscription_cancel
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "subscription_cancel",
  "subscription": "YOUR_SUBSCRIPTION_ID"
}'
HTTP 200 · subscription_cancel
{
  "subscription": {
    "id": "YOUR_SUBSCRIPTION_ID",
    "service_id": "1234",
    "quantity": 500,
    "currency": "USD",
    "spending_cap": "25.000000",
    "spent": "0.000000",
    "max_posts": 10,
    "post_count": 0,
    "state": "canceled",
    "pause_reason": null
  }
}

webhook_set

Configurez un destinataire HTTPS vérifié par compte. Cette fonction doit être activée dans le déploiement. Générez un secret base64url aléatoire de 32 à 128 caractères. Vérifiez X-SMM-Signature, puis renvoyez le défi webhook.verify en JSON. Une reconfiguration invalide les anciens événements en attente.

POST /api/v3 · webhook_set
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "webhook_set",
  "url": "https://example.com/smm-webhook",
  "secret": "REPLACE_WITH_RANDOM_BASE64URL_SECRET"
}'
HTTP 200 · webhook_set
{
  "webhook": {
    "url": "https://example.com/smm-webhook",
    "enabled": true
  }
}

webhook_status

Consulter l’URL actuelle, l’état d’activation et la date de mise à jour. Le secret de signature n’est jamais renvoyé.

POST /api/v3 · webhook_status
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "webhook_status"
}'
HTTP 200 · webhook_status
{
  "webhook": {
    "url": "https://example.com/smm-webhook",
    "enabled": true,
    "updated_at": "2026-10-15T12:00:00Z"
  }
}

webhook_disable

Désactiver les futurs envois. Une requête HTTP déjà en cours peut se terminer.

POST /api/v3 · webhook_disable
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "webhook_disable"
}'
HTTP 200 · webhook_disable
{
  "webhook": {
    "enabled": false
  }
}

webhook_deliveries

Lisez jusqu'à 20 diffusions, leur charge utile, leurs tentatives, le dernier statut HTTP et l'heure de la prochaine tentative. Passez after=next_cursor pour les pages suivantes. L'historique est conservé pendant 30 jours.

POST /api/v3 · webhook_deliveries
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "webhook_deliveries"
}'
HTTP 200 · webhook_deliveries
{
  "deliveries": [],
  "next_cursor": null
}

webhook_replay

Remettre en file un événement livré ou échoué pour la même version du destinataire. Son identifiant est conservé. Les consommateurs doivent éliminer les doublons ; le rejeu ne répète jamais une commande ni une mutation du portefeuille.

POST /api/v3 · webhook_replay
curl --fail-with-body --silent --show-error --max-time 60 \
  -X POST https://smm.africa/api/v3 \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SMM_AFRICA_KEY" \
  -d '{
  "action": "webhook_replay",
  "event": "evt_123"
}'
HTTP 200 · webhook_replay
{
  "event": "evt_123",
  "queued": true
}

Vérifier et rapprocher les événements de commande

X-SMM-Signature contient t=UNIX_SECONDS,v1=HEX_HMAC_SHA256. Horodatage du signe + "." + le corps brut exact de la requête avec votre secret. Utilisez la comparaison à temps constant et rejetez les horodatages situés à plus de cinq minutes de votre horloge. Conservez chaque ID d’événement avant de renvoyer 2xx. La livraison s'effectue au moins une fois et peut arriver en panne. Les événements couvrent l’activité des commandes du compte, y compris les commandes sur le site Web. Récupérer le statut pour les détails actuels de la livraison et du remboursement ; les sondages restent la solution de repli pour la réconciliation. Nouvelles tentatives de livraison ayant échoué jusqu'à huit fois avec interruption ; les redirections sont rejetées.

order.updated
{
  "id": "evt_123",
  "type": "order.updated",
  "api_version": "3.3",
  "created_at": "2026-10-15T12:00:00Z",
  "data": {
    "order": "1000000",
    "status": "completed"
  }
}

Erreurs et tentatives

Vérifiez l'état HTTP et le champ d'erreur JSON. Les erreurs d'authentification utilisent HTTP 400 ; Les appelants d'API ne sont pas redirigés vers la connexion. Enregistrez les erreurs techniques en privé et montrez aux clients un message neutre.

HTTP 400 · application/json
{
  "error": "Invalid API key",
  "code": "INVALID_API_KEY",
  "request_id": "request-123",
  "retryable": false
}

Ajouter la relecture des réponses pendant 24 heures. Après expiration, la même clé peut créer une autre commande : réconcilier d'abord. REQUEST_IN_PROGRESS autorise la même demande/clé après Retry-After. IDEMPOTENCY_CONFLICT nécessite la restauration de la charge utile d'origine. ACTION_OUTCOME_UNCONFIRMED nécessite un examen du support : ne modifiez jamais les clés pour le contourner. PRICE_LIMIT_EXCEEDED signifie qu'aucun débit ou commande n'a été engagé. Enregistrez request_id (également X-Request-Id) pour obtenir de l'aide.

HTTPErreur / conditionQue faire
400Invalid API keyVérifiez la clé et les champs obligatoires. Corrigez la demande avant de réessayer.
402Insufficient balanceAlimentez le portefeuille du compte avant de soumettre à nouveau la commande.
409A matching API order request is already being processedAttendez avant de réessayer la requête identique avec sa clé d'idempotence d'origine.
409This idempotency key was already used for a different API order requestRestaurez la charge utile d'origine pour une nouvelle tentative. Utilisez une nouvelle clé uniquement pour un nouvel ordre logique.
415Unsupported content typeEnvoyez des champs de formulaire JSON, codés en URL ou des champs de texte en plusieurs parties.
423Account suspended (message varies)Résolvez la restriction de compte avec l'assistance ; ne réessayez pas à plusieurs reprises.
429Too many requests. Please slow down and try again shortly.Attendez l'intervalle Réessayer-Après, puis réessayez avec une interruption.
500 / 503Server failure or temporary unavailability (message varies)Reculez. Pour les soumissions de commandes, conservez la même charge utile et la même clé d’idempotence.

Réessayez une commande sans facturer deux fois

  1. Créez et conservez une clé idempotency_key unique pour chaque commande logique avant d'envoyer l'ajout. Remplacez l'exemple de clé par votre propre valeur unique.
  2. Attendez jusqu'à 60 secondes pour la requête du serveur. Après 20 secondes, affichez un message en attente au client pendant que la demande backend se poursuit.
  3. Si aucune réponse n'arrive, réessayez exactement la même charge utile avec la même clé après un délai. Ne générez pas de nouvelle clé. Une nouvelle tentative terminée rejoue la réponse avec X-Idempotent-Replay : true.
  4. Une fois que vous recevez un identifiant de commande, enregistrez-le et utilisez le statut pour suivre cette commande. Une réponse en file d’attente signifie acceptée pour exécution et non livraison terminée.

Les en-têtes Idempotency-Key et X-Idempotency-Key sont également pris en charge. Sans clé client, une commande peut toujours être soumise, mais une nouvelle tentative après un délai d'attente ne peut pas identifier en toute sécurité la tentative initiale.

Limites de débit

Les limites sont spécifiques à l'action et configurables en fonction du déploiement. Sur HTTP 429, honorez Retry-After (secondes). Sans cet en-tête, utilisez un intervalle exponentiel avec gigue, par exemple 2, 4, 8, puis 16 secondes plus un petit délai aléatoire. Nouvelles tentatives liées et signalez des échecs persistants à votre opérateur.

Mettez en cache le catalogue récupéré avec POST /api/v3 et action=services. Actualisez-le périodiquement et vérifiez les identifiants de service actuels, les tarifs et les contraintes min/max avant de commander.

Cycle de vie des commandes

Envoyez action=status avec un ID de commande par demande. En tant que politique client de départ, interrogez toutes les 30 secondes, puis augmentez l'intervalle pour les commandes de longue durée ; limites de taux d’honneur. Échelonnez les demandes sur les commandes. Les webhooks ne sont actuellement pas pris en charge.

queued → pending → processing
États actifs : continuer l'interrogation. Les commandes peuvent sauter des états intermédiaires.
completed · partial · refunded · canceled
États du terminal : arrêter l'interrogation de livraison de routine. Partielle signifie que la livraison était incomplète ; inspecter la charge et les restes. Les demandes de recharge et d’annulation sont soumises à l’éligibilité du service et de la commande.
unknown
Un Etat non reconnu ; ne le considérez pas comme un succès et ne passez pas automatiquement une commande de remplacement. Réessayez le statut avec interruption et contactez l'assistance s'il persiste.

Notes d'intégration pour une utilisation en production

Traitez l'API comme une infrastructure. Ces notes couvrent les éléments qui comptent une fois que vous exécutez des commandes automatisées, un panel de clients ou une vitrine à volume élevé.

Solde du portefeuille partagé

Les commandes directes, les commandes en vitrine et les commandes API sont toutes tirées du même solde du portefeuille. Financez-le depuis n'importe quel canal, utilisez-le depuis n'importe quel canal.

Sécurisez votre clé

N'exposez jamais la clé, le nom d'hôte de l'API, le nom du fournisseur configuré ou les erreurs de transport brut dans le code côté client ou les messages de vitrine. Appels proxy via votre backend, enregistrez les détails techniques en privé et, après 20 secondes, affichez aux clients une formulation neutre telle que : La soumission de la commande prend plus de temps que prévu. Vérifiez vos commandes avant de réessayer.

Réponses rapides

Comment obtenir une clé API ?

Connectez-vous à SMM Africa, ouvrez un compte, copiez votre clé API et faites-la pivoter à tout moment depuis le même endroit.

L'API est-elle gratuite ?

Il n'y a pas de frais API supplémentaires. Vous ne payez que les services que vous commandez. Le même portefeuille finance les commandes directes, les commandes en vitrine et les commandes API.

Quelles sont les limites de débit ?

Les limites sont spécifiques à l'action et peuvent changer. Espacez les appels en masse, les sondages d'état par lots et lorsque l'API renvoie 429, attendez l'intervalle Réessayer-Après avant de réessayer.

Comment dois-je gérer les nouvelles tentatives ?

Envoyez un en-tête Idempotency-Key unique ou un champ idempotency_key pour chaque ordre d'ajout logique. Si la demande expire, réessayez la charge utile identique avec la même clé afin qu'une tentative terminée soit rejouée sans autre frais.

Existe-t-il un webhook ?

L'interrogation d'état est le chemin pris en charge aujourd'hui. Appuyez sur l'action de statut pour les commandes que vous surveillez et mettez en cache le résultat dans votre propre système.

Quels pays sont pris en charge ?

L'API est disponible dans le monde entier, avec un fort support pour les marchés africains et le financement par portefeuille compatible M-Pesa.

Vocabulaire API

Termes que les revendeurs doivent comprendre

Revendeur API
Une interface serveur à serveur qui permet à un autre panneau ou flux de travail de passer et de suivre les commandes SMM Africa depuis son propre application.
Catalogue de services
La liste en direct des identifiants de service, des prix, des limites, du support de recharge et du support d'annulation utilisés avant de passer une commande.
Mesures
Le champ JSON qui choisit l'opération API, telle que le solde, les services, l'ajout, le statut, le rechargement ou l'annulation.
Supporté par un portefeuille ordering
Un modèle de commande dans lequel les commandes directes, en vitrine et API proviennent toutes du même solde de portefeuille SMM Africa financé.