Enterprise

Documentation API

Le scanner d'enquête ZAYKO 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 zayko_xxxxxxxxxxxxxxxx
# ou
X-API-Key: zayko_xxxxxxxxxxxxxxxx

Les clés d'essai (zayko_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 $ZAYKO_KEY" \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/risk?mint=4BHuvKFACNeDmHn3zxLTCVn5zBfKWi7hpFYjDC57pump"
{
  "mint": "4BHuvKFAC...pump",
  "score": 67,
  "verdict": "MANUAL REVIEW",
  "liquidityUsd": 142000,
  "topHoldersPct": 31.4,
  "sellable": true,
  "timestamp": "2026-09-02T11:00:00.000Z"
}
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 $ZAYKO_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 $ZAYKO_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 $ZAYKO_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. ZAYKO 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, ZAYKO compare le résultat simulé à ce que ton application prétend faire.

curl -X POST -H "Authorization: Bearer $ZAYKO_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/zayko-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. ZAYKO 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. ZAYKO 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 $ZAYKO_KEY" \
  "https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/events?severity=critical&limit=20"
{
  "events": [
    {
      "id": "3f1c...",
      "mint": "4BHuvKFAC...pump",
      "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": "ZAYKO AI 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":"4BHuvKFAC...pump","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 $ZAYKO. La preuve d'authenticité est la transaction elle-même : elle est vérifiée on-chain et ne peut servir qu'une fois.

curl -X POST -H "Content-Type: application/json" \
  -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
Starter$495 00060
Pro$14950 000120
Enterprise$499500 000300

Chaque réponse porte les en-têtes X-Zayko-Quota-Limit, X-Zayko-Quota-Remaining, X-Zayko-Quota-Reset et X-Zayko-RateLimit-Limit. À partir de 80 % de consommation, l'en-tête X-Zayko-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 zayko.d.ts

# client Python
openapi-generator generate -g python -i https://project--95462de0-d34d-43ed-8465-db9987a4db07.lovable.app/api/public/openapi.json -o zayko-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.ZAYKO_KEY}` } },
);
if (!res.ok) throw new Error(`ZAYKO ${res.status}`);

const remaining = Number(res.headers.get("X-Zayko-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['ZAYKO_KEY']}"},
    timeout=30,
)
r.raise_for_status()
risk = r.json()
print(risk["verdict"], risk["score"], r.headers.get("X-Zayko-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.ZAYKO_KEY}` },
  });
  const { events, cursor: next } = await res.json();
  if (next) cursor = next;
  for (const ev of events) handle(ev);
}, 60_000);

Webhooks — ZAYKO pousse, tu réagis

L'API répond quand tu demandes. Le webhook fait l'inverse : ZAYKO 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-Zayko-Event (nom de l'événement), X-Zayko-Severity et X-Zayko-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://labzayko.com/scan/So1111...",
  "createdAt": "2026-09-03T16:20:00.000Z"
}