Enterprise

Documentation API

Le scanner d'enquête TONTON en JSON : score de risque, filtre de listing et scan par lot. Authentification par clé API, quota mensuel et limite de débit par clé.

Tester l'API maintenant

5 essais gratuits / 24 h

Aucun compte ni clé nécessaire : colle une adresse de mint Solana et regarde la réponse exacte de GET /api/public/risk.

Clé d'essai instantanée

Teste l'API en 10 secondes, sans compte

Une adresse e-mail suffit : tu reçois immédiatement une clé valable 100 appels sur 7 jours, limitée à GET /api/public/risk et 5 appels par minute. Une seule clé d'essai par adresse.

Authentification

Génère une clé depuis /enterprise/keys puis envoie-la sur chaque appel. Les deux en-têtes sont acceptés. Les quotas et prix de chaque offre sont détaillés sur /enterprise/tarifs.

Authorization: Bearer tonton_xxxxxxxxxxxxxxxx
# ou
X-API-Key: tonton_xxxxxxxxxxxxxxxx

Les clés d'essai (tonton_trial_…) s'utilisent de la même façon, mais n'ouvrent que GET /api/public/risk : les autres endpoints répondent 403. Une alerte e-mail est envoyée automatiquement à 80 % puis à 100 % du quota mensuel des clés complètes.

GET/api/public/risk?mint=<MINT>

Score de risque

Verdict, score /100, liquidité, concentration du top 10 et test de vendabilité.

curl -H "Authorization: Bearer $TONTON_KEY" \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/risk?mint=So11111111111111111111111111111111111111112"
{
  "mint": "So111111...1112",
  "score": 67,
  "verdict": "MANUAL REVIEW",
  "liquidityUsd": 142000,
  "topHoldersPct": 31.4,
  "sellable": true,
  "timestamp": "2026-09-02T11:00:00.000Z"
}
GET/api/public/mev-shield?mint=<MINT>&amountUsd=<USD>

MEV Shield (avant l'ordre)

Renvoie le plan d'exécution protégé d'un ordre : impact de prix, tolérance de prix à inscrire, taille sûre par ordre, découpage conseillé, gain qu'un robot sandwich peut espérer, frais de priorité et pourboire de bloc privé.

curl -H "Authorization: Bearer $TONTON_KEY" \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/mev-shield?mint=<MINT>&amountUsd=2000"
{
  "mint": "<MINT>",
  "amountUsd": 2000,
  "shieldScore": 78,
  "risk": "medium",
  "verdict": "ORDRE À DÉCOUPER",
  "priceImpactPct": 1.8,
  "recommendedSlippagePct": 0.9,
  "safeSizeUsd": 1100,
  "splitOrders": 2,
  "perOrderUsd": 1000,
  "attackerProfitUsd": 10.4,
  "priorityFeeMicroLamports": 120000,
  "jitoTipSol": 0.0006
}
GET/api/public/social-radar?mint=<MINT>

Social Radar 2.0 (comptes X & Telegram)

Note les comptes qui poussent un token : shills, comptes automatisés, rug-callers récidivistes, influenceurs à engagement anormalement bas. Chaque compte est accompagné de son historique TONTON (tokens déjà promus, dont ceux notés à haut risque) et les canaux Telegram annoncés sont vérifiés.

curl -H "Authorization: Bearer $TONTON_KEY" \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/social-radar?mint=<MINT>"
{
  "mint": "<MINT>",
  "manipulationScore": 68,
  "verdict": "PROMOTION ORGANISÉE",
  "stats": {
    "accountsSeen": 34,
    "shills": 9,
    "bots": 3,
    "rugCallers": 2,
    "suspiciousInfluencers": 1,
    "manufacturedPostPct": 61,
    "tokenScore": 38
  },
  "accounts": [
    {
      "handle": "some_account",
      "risk": 82,
      "labels": ["shill", "rug-caller"],
      "followers": 1840,
      "postsOnToken": 6,
      "knownMints": 7,
      "riskyMints": 3
    }
  ],
  "telegram": [
    { "handle": "sometoken", "members": 214, "status": "ok" }
  ]
}
GET/api/public/listing-gate?mint=<MINT>&configId=<UUID>

Listing gate

Applique tes règles de listing (liquidité minimale, concentration maximale, mint authority, honeypot, score, âge) et retourne APPROVE, MANUAL_REVIEW ou REJECT avec les preuves. Configure tes règles sur /enterprise/listing-gate.

curl -H "Authorization: Bearer $TONTON_KEY" \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/listing-gate?mint=<MINT>&configId=<UUID>"
POST/api/public/bulk-scan

Scan par lot

Envoie jusqu'à 50 mints, récupère un identifiant de job, puis interroge son avancement.

curl -X POST -H "Authorization: Bearer $TONTON_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mints":["<MINT_1>","<MINT_2>"]}' \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/bulk-scan"

curl -H "Authorization: Bearer $TONTON_KEY" \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/bulk-scan/jobs/<JOB_ID>"
POST/api/public/firewall

Transaction Firewall (avant signature)

Appelle cet endpoint juste avant de demander la signature du wallet. TONTON simule la transaction on-chain sans la diffuser et renvoie ALLOW, WARN, BLOCK ou UNKNOWN, avec les autorités de token touchées, les programmes inconnus, les transferts inattendus et l'écart avec l'action annoncée. Le champ expected est optionnel : s'il est fourni, TONTON compare le résultat simulé à ce que ton application prétend faire.

curl -X POST -H "Authorization: Bearer $TONTON_KEY" \
  -H "Content-Type: application/json" \
  -d '{"transaction":"<TX_BASE64_NON_SIGNEE>",
       "expected":{"action":"swap 1 SOL -> BONK","mint":"<MINT>","maxSolOut":1.05}}' \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/firewall"

Intégration côté dApp :

const tx = await buildSwapTransaction(...)
const b64 = Buffer.from(tx.serialize({ requireAllSignatures: false })).toString("base64")

const res = await fetch("/api/tonton-firewall", {
  method: "POST",
  body: JSON.stringify({ transaction: b64, expected: { mint, maxSolOut: 1.05 } }),
}).then((r) => r.json())

if (res.verdict === "BLOCK") return showBlockingModal(res.findings)
if (res.verdict === "WARN") await confirmWithUser(res.findings)
await wallet.signTransaction(tx)

Réponse : verdict, risk (0-100), simulated, findings[] (code, severity, title, detail), programs[], solDelta, tokenDeltas[]. Codes de finding stables : authority_change, freeze_authority, delegation, unknown_program, unexpected_token_transfer, large_sol_outflow, outcome_differs, simulation_failed. TONTON ne bloque jamais silencieusement : si la simulation est impossible, le verdict est UNKNOWN et à toi de décider.

Execution protection. Quand la transaction contient un swap identifié, la réponse porte en plus un bloc execution : sandwichExposure (high / medium / low), slippagePct décodé depuis l'instruction de swap, expectedOutUi (sortie simulée) et worstOutUi (plancher réellement garanti par le minOut signé), mevProtection (on / partial / off, d'après la présence d'un tip Jito et d'un compte marqueur jitodontfront), jitoTipSol, dontFront, priorityFee (prix par unité de calcul, coût en SOL, verdict, médiane réseau observée) et recommendations[] avec des valeurs concrètes à appliquer. Nouveaux codes de finding : sandwich_exposure, high_slippage, abnormal_priority_fee. TONTON ne reconstruit ni ne signe ta transaction : il dit quoi corriger avant envoi. Ce qui n'est pas décodable reste à null, jamais estimé.

"execution": {
  "isSwap": true,
  "dexName": "Jupiter Aggregator v6",
  "sandwichExposure": "high",
  "slippagePct": 8,
  "expectedOutUi": 1284.42,
  "worstOutUi": 1181.66,
  "mevProtection": "off",
  "jitoTipSol": null,
  "dontFront": false,
  "priorityFee": { "microLamports": 0, "computeUnits": null, "solCost": 0, "verdict": "low", "networkMedian": 12500 },
  "recommendations": [
    { "code": "reduce_slippage", "value": "slippageBps: 100 (1 %) — 50 sur les paires liquides" },
    { "code": "enable_jito_protection", "value": "tip >= 0.0005 SOL -> 96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5" },
    { "code": "set_priority_fee", "value": "SetComputeUnitPrice: 25000 µlamports/CU" }
  ]
}
GET/api/public/events?mint=<MINT>&severity=warning

Flux d'événements de risque

Historique des événements détectés en continu. Filtres : mint, kind, severity (gravité minimale), since (date ISO), limit (1 à 200, 50 par défaut). Le champ cursor renvoyé se repasse en since pour ne récupérer que le nouveau.

curl -H "Authorization: Bearer $TONTON_KEY" \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/events?severity=critical&limit=20"
{
  "events": [
    {
      "id": "3f1c...",
      "mint": "So111111...1112",
      "kind": "liquidity.drop",
      "severity": "critical",
      "title": "Liquidité en chute",
      "message": "Liquidité en chute de 45 % — score 82 → 54.",
      "score": 54,
      "previousScore": 82,
      "liquidityUsd": 41200,
      "previousLiquidityUsd": 74900,
      "data": {},
      "createdAt": "2026-09-03T16:20:00.000Z"
    }
  ],
  "count": 1,
  "cursor": "2026-09-03T16:20:00.000Z"
}
GET/api/public/audit/<REPORT_ID>

Rapport d'audit signé (public)

Aucune clé API : un rapport doit pouvoir être contrôlé par n'importe qui. Retourne le document canonique, son empreinte SHA-256, la signature Ed25519, la clé publique et le résultat de la revérification côté serveur. Réponse mise en cache 5 minutes, 120 vérifications par adresse IP toutes les 10 minutes. Le rapport lisible est sur /audit/<REPORT_ID>.

curl "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/audit/<REPORT_ID>"
{
  "reportId": "0f7e...c31a",
  "issuedAt": "2026-09-03T18:04:00.000Z",
  "document": { "version": "zayko-audit-1", "issuer": "Tonton Wallat Lab", "score": 78, "verdict": "RISQUE FAIBLE" },
  "digest": "9c1b...",
  "signature": "5Kd3...",
  "algorithm": "Ed25519",
  "keyId": "a71f3c0b9d22",
  "publicKey": "8Wq2...",
  "verification": { "digestMatches": true, "signatureValid": true }
}
GET/api/public/live-feed

Flux live des nouveaux tokens (SSE)

Server-Sent Events : chaque nouveau token Solana noté dès sa détection. Pas de clé API, 20 connexions par adresse IP toutes les 10 minutes. Variante par adresse : GET /api/public/scan-stream?address=<MINT> remplit le dossier pièce par pièce au lieu d'attendre la fin de l'analyse.

curl -N "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/live-feed"

data: {"type":"token","mint":"So111111...1112","score":41,"verdict":"HAUT RISQUE"}
data: {"type":"end"}
POST/api/public/enterprise-payment

Confirmation de paiement

Active une offre sur une clé après un paiement en $TONTON. Deux preuves sont exigées : le secret de la clé concernée et la transaction elle-même, vérifiée on-chain et utilisable une seule fois.

curl -X POST -H "Content-Type: application/json" \
  -H "Authorization: Bearer <TON_SECRET_DE_CLE>" \
  -d '{"keyId":"<KEY_UUID>","planId":"<PLAN_UUID>","signature":"<TX_SIGNATURE>"}' \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/enterprise-payment"

Quotas et limites de débit

OffrePrix / moisAppels / moisAppels / minute
FreeGratuit10010
Oracle DécouverteGratuit505
Starter$495 00060
Oracle Starter$7910 00060
Pro$14950 000120
Oracle Pro$249100 000180
Enterprise$499500 000300
Oracle Protocol$7491 000 000600

Chaque réponse porte les en-têtes X-Tonton-Quota-Limit, X-Tonton-Quota-Remaining, X-Tonton-Quota-Reset et X-Tonton-RateLimit-Limit. À partir de 80 % de consommation, l'en-tête X-Tonton-Quota-Warning est ajouté.

Codes d'erreur

  • 400 — paramètre manquant ou invalide.
  • 401 — clé API absente, invalide ou révoquée.
  • 402 — offre expirée : renouvelle depuis /enterprise/keys.
  • 429 — quota mensuel atteint ou limite par minute dépassée (en-tête Retry-After).
  • 500 — scan impossible (RPC indisponible) : réessaie, aucun crédit n'est remboursé automatiquement.

Spécification OpenAPI

Toute l'API est décrite dans un fichier OpenAPI 3.1 servi publiquement. Importe-le dans Postman, Insomnia ou Swagger UI, ou génère un client typé dans ton langage.

https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/openapi.json

# client TypeScript
npx openapi-typescript https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/openapi.json -o tonton.d.ts

# client Python
openapi-generator generate -g python -i https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/openapi.json -o tonton-python

Exemples de code

Garde la clé côté serveur : elle consomme ton quota et ne doit jamais partir dans un bundle navigateur.

TypeScript

const res = await fetch(
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/risk?mint=" + mint,
  { headers: { Authorization: `Bearer ${process.env.TONTON_KEY}` } },
);
if (!res.ok) throw new Error(`TONTON ${res.status}`);

const remaining = Number(res.headers.get("X-Tonton-Quota-Remaining") ?? 0);
const risk = await res.json();
if (risk.score < 45) blockListing(risk);

Python

import os, requests

r = requests.get(
    "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/risk",
    params={"mint": mint},
    headers={"Authorization": f"Bearer {os.environ['TONTON_KEY']}"},
    timeout=30,
)
r.raise_for_status()
risk = r.json()
print(risk["verdict"], risk["score"], r.headers.get("X-Tonton-Quota-Remaining"))

Suivi des événements (boucle de curseur)

let cursor = null;
setInterval(async () => {
  const url = new URL("https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/events");
  url.searchParams.set("severity", "warning");
  if (cursor) url.searchParams.set("since", cursor);

  const res = await fetch(url, {
    headers: { Authorization: `Bearer ${process.env.TONTON_KEY}` },
  });
  const { events, cursor: next } = await res.json();
  if (next) cursor = next;
  for (const ev of events) handle(ev);
}, 60_000);

Webhooks — TONTON pousse, tu réagis

L'API répond quand tu demandes. Le webhook fait l'inverse : TONTON surveille en continu et prévient ton serveur dès qu'un événement tombe. Tu choisis tes règles depuis /enterprise/feed (types d'événements, mints, gravité minimum, score plancher).

Chaque livraison est un POST JSON signé : X-Tonton-Event (nom de l'événement), X-Tonton-Severity et X-Tonton-Signature: sha256=HMAC(secret, body). Vérifie la signature avant de traiter le corps.

  • risk.changed — le score bouge significativement.
  • liquidity.drop — chute brutale de liquidité.
  • whale.movement — mouvement d'un top holder.
  • holder.concentration — concentration devenue dangereuse.
  • deployer.detected — deployer déjà identifié qui relance.
  • authority.changed — autorité mint/freeze modifiée.
  • abnormal.activity — volume/liquidité anormaux.
  • launch.detected — nouveau lancement repéré.
  • listing_gate.blocked — un token a été refusé par tes règles de listing.
{
  "event": "risk_event",
  "topic": "liquidity.drop",
  "severity": "critical",
  "mint": "So1111...",
  "score": 54,
  "prevScore": 82,
  "liquidityUsd": 41200,
  "message": "Liquidité en chute de 45 % — score 82 → 54.",
  "dossierUrl": "https://tontonwallat.com/scan/So1111...",
  "createdAt": "2026-09-03T16:20:00.000Z"
}
POST/api/public/auto-audit

Smart Contract Auto-Auditor

Un appel : TONTON analyse le token, rédige le verdict IA, signe le document en Ed25519 et renvoie soit le JSON du rapport avec son lien PDF, soit directement le PDF (format: "pdf"). Le rapport est figé : son empreinte SHA-256 et sa signature restent vérifiables publiquement sur /audit/<reportId>.

curl -X POST https://tontonwallat.com/api/public/auto-audit \
  -H "Authorization: Bearer $TONTON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mint":"So11111111111111111111111111111111111111112","format":"json"}'
{
  "reportId": "6f1c…",
  "mint": "So1111…",
  "score": 82,
  "verdict": "RISQUE FAIBLE",
  "signatureValid": true,
  "digest": "9ac3…",
  "pdfUrl": "https://tontonwallat.com/api/public/audit/6f1c…/pdf",
  "reportUrl": "https://tontonwallat.com/audit/6f1c…"
}

Le PDF est public et immuable : partage le lien dans ta documentation, ton dossier de levée ou ta page de listing. GET /api/public/audit/<reportId>/pdf ne consomme aucun quota.

PDF en marque blanche

Ajoute "brand": "<slug>" (le slug d'un widget white-label actif) pour générer le rapport à ta marque : bandeau, couleur d'accent, pied de page, mention « propulsé par TONTON » désactivable et analyse IA masquable. Le même paramètre fonctionne en lecture : GET /api/public/audit/<reportId>/pdf?brand=<slug>.

curl -X POST https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/auto-audit \
  -H "Authorization: Bearer $TONTON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mint":"<MINT>","format":"pdf","brand":"mon-launchpad"}' \
  --output audit.pdf

Le rapport avancé contient la jauge de risque, le tableau des contrôles avec leur statut, les données de marché et de détention, l'analyse IA, l'empreinte SHA-256 et la signature Ed25519 complètes, le lien de vérification cliquable et la pagination.

Listing Gate as a Service (DEX & launchpads)

Trois lignes dans ton flux de création de pool ou de soumission de projet : TONTON renvoie APPROVE, MANUAL_REVIEW ou REJECT selon les règles que tu as définies dans la console Listing Gate. Chaque décision est archivée et les rejets alimentent le Risk Feed.

// Node / Cloudflare Worker — hook avant listing
const gate = await fetch(
  `https://tontonwallat.com/api/public/listing-gate?mint=${mint}&configId=${GATE_CONFIG_ID}`,
  { headers: { Authorization: `Bearer ${process.env.TONTON_API_KEY}` } },
).then((r) => r.json());

if (gate.decision === "REJECT") return refuse(gate.reasons);
if (gate.decision === "MANUAL_REVIEW") return queueForReview(gate);
await publishListing(mint, { tontonScore: gate.score, tontonReport: gate.reportUrl });

Combine-le avec l'Auto-Auditor pour publier un PDF d'audit à côté de chaque token accepté, et avec le scanner white-label pour que tes utilisateurs vérifient eux-mêmes un token sans quitter ton site.

Support et intégration

Pour toute question sur l'API, les quotas, l'intégration ou un volume sur mesure, écris à contact@tontonwallat.com.