API

Hozz létre ellenőrzési kérelmeket a saját rendszereidből, küldd el az aláírási linket a partnerednek, és kérd le a tanúsítványt, amikor aláír. A partner oldalán semmi sem változik: megnyitja a linket, és aláír egyetlen üzenetet, fiók nélkül.

Az API-hozzáférés a Pro és a Business csomag része. Kulcsot a Fiók → API-kulcsok menüpontban hozhatsz létre.

Hitelesítés

A kulcsot minden hívásnál bearer tokenként küldd. A kulcsok csak egyszer, létrehozáskor jelennek meg; mi csak a hash-üket tároljuk.

Authorization: Bearer signet_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Alap URL: https://basignet.com/api/v1. Gépileg olvasható leírás: /api/v1/openapi.json.

Kérelem létrehozása

curl https://basignet.com/api/v1/requests \
  -H "Authorization: Bearer $SIGNET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "chain": "tron",
    "targetAddress": "TNeiUDQmrGHbsC4oPd8L6dZdxyPQrrWyP2",
    "reference": "KYC-2026-0412",
    "anchor": true,
    "messageLocale": "ru",
    "expiresAt": "2026-10-31T23:59:59Z"
  }'

Csak a chain kötelező. Hagyd üresen a targetAddress mezőt, ha a partner adja meg a címet, amellyel aláír; töltsd ki, ha pontosan azt a címet követeled meg.

Az anchor: true aláírás után rögzíti a tanúsítványt a blokkláncon, és ekkor számít bele a havi keretedbe. A messageLocale az alapértelmezett üzenet nyelvét állítja be (lásd Láncok és nyelvek); a message a törzsét a saját szövegedre cseréli. A Nonce / Issued / Domain lábléc mindig hozzáfűződik.

A válasz a kérelemobjektum. A signingUrl értéket a saját csatornádon küldd el a partnernek.

Kérelem lekérése

curl https://basignet.com/api/v1/requests/{token} \
  -H "Authorization: Bearer $SIGNET_KEY"

Visszaadja a kérelemobjektumot. A status értéke pending, failed (az utolsó aláírás ellenőrzése nem sikerült; a link továbbra is használható), verified vagy expired. Ellenőrzés után a certificate ki van töltve.

Kérelmek listázása

curl "https://basignet.com/api/v1/requests?status=verified&limit=50" \
  -H "Authorization: Bearer $SIGNET_KEY"

{ "object": "list", "data": [ …requests ], "hasMore": true, "nextBefore": "2026-09-30T10:12:03.117Z" }

A legújabbak elöl. A limit 1 és 100 közötti (alapértelmezés 20), a status szűr, a before pedig az előző oldal nextBefore értékét veszi át.

Tanúsítvány

curl https://basignet.com/api/v1/requests/{token}/certificate \
  -H "Authorization: Bearer $SIGNET_KEY" -o proof.json

curl "https://basignet.com/api/v1/requests/{token}/certificate?format=pdf" \
  -H "Authorization: Bearer $SIGNET_KEY" -o certificate.pdf

Az önálló bizonyítékcsomag JSON formátumban, vagy a PDF a ?format=pdf paraméterrel. Amíg a kérelmet nem írták alá, 409-et ad vissza. A csomag nélkülünk is ellenőrizhető, a nyílt forráskódú ellenőrzővel.

Láncok és nyelvek

curl https://basignet.com/api/v1/chains

Nyilvános, kulcs nélkül: a támogatott láncok (az id értéket használd chain-ként) és a messageLocale számára elérhető nyelvek.

Webhookok

Állíts be egy végpontot a Fiók → Webhookok alatt, hogy lekérdezés helyett HTTPS POST-ot kapj:

A törzs { id, type, created, data: { request } }, ahol a request ugyanaz az objektum, amelyet az API visszaad. 5 másodpercen belül válaszolj bármilyen 2xx kóddal. A sikertelen kézbesítéseket 1 perc, 5 perc, 30 perc, 2, 6, 12 és 24 óra után újrapróbáljuk, majd sikertelennek jelöljük. Az id segítségével szűrd ki a duplikátumokat.

Minden POST tartalmazza a Signet-Signature: t=…,v1=… fejlécet: a v1 a t + "." + raw body hexadecimális HMAC-SHA256 értéke a végpontod aláírási titkával. A nyers törzsön ellenőrizd, feldolgozás előtt, és utasítsd el a néhány percnél régebbi időbélyegeket:

// Node.js
import { createHmac, timingSafeEqual } from "node:crypto";

function verifySignet(rawBody, header, secret, toleranceSec = 300) {
  const { t, v1 } = Object.fromEntries(header.split(",").map((kv) => kv.split("=")));
  if (!t || !v1 || Math.abs(Date.now() / 1000 - Number(t)) > toleranceSec) return false;
  const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest();
  const given = Buffer.from(v1, "hex");
  return given.length === expected.length && timingSafeEqual(given, expected);
}
# Python
import hmac, hashlib, time

def verify_signet(raw_body: bytes, header: str, secret: str, tolerance: int = 300) -> bool:
    parts = dict(kv.split("=", 1) for kv in header.split(","))
    t, v1 = parts.get("t"), parts.get("v1")
    if not t or not v1 or abs(time.time() - int(t)) > tolerance:
        return False
    expected = hmac.new(secret.encode(), f"{t}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, v1)

Hibák és korlátok

HTTP/1.1 403
{ "error": { "type": "plan_required", "message": "API access is included in the Pro and Business plans." } }

A hibák JSON formátumúak: { "error": { "type", "message" } }. Típusok: unauthorized (401), plan_required (403), not_found (404, egy másik fiók tokenjére is), conflict (409), invalid_request (400), rate_limited (429, Retry-After fejléccel).

Kulcsonként percenként 120 hívás engedélyezett.

A kérelemobjektum

{
  "object": "request",
  "token": "q0tHA2UW6oiuuzVC1qtIf2N1dgKX6miW",
  "status": "verified",                      // pending | failed | verified | expired
  "chain": "ethereum",
  "chainLabel": "Ethereum",
  "targetAddress": null,                     // null = supplied by the signer
  "reference": "KYC-2026-0412",
  "anchor": true,
  "signingUrl": "https://basignet.com/s/q0tHA2UW6oiuuzVC1qtIf2N1dgKX6miW",
  "challenge": "BA Signet — Proof of Wallet Control\n…\nNonce: …\nIssued: …\nDomain: basignet.com",
  "createdAt": "2026-09-30T09:58:41.201Z",
  "expiresAt": null,
  "completedAt": "2026-09-30T10:03:12.554Z",
  "certificate": {                           // null until signed
    "address": "0x5e3fbf618ef1cc1cc021e7fed95e07c6ff334ca8",
    "sigType": "eip191",
    "contentHash": "0xaa00c6f6…",
    "verifiedAt": "2026-09-30T10:03:12.554Z",
    "verifyUrl": "https://basignet.com/verify/0xaa00c6f6…",
    "anchorStatus": "anchored",              // unanchored | pending | anchored
    "anchor": {                              // null until anchored
      "chain": "polygon",
      "txHash": "0x…",
      "txUrl": "https://polygonscan.com/tx/0x…",
      "blockNumber": 94660444,
      "blockTime": "2026-09-29T15:30:06.000Z",
      "merkleRoot": "0x…",
      "bitcoinBlockHeight": null
    }
  }
}

A v1-en belül új mezők jelenhetnek meg; a meglévőket nem nevezzük át és nem távolítjuk el.