Proof of Seller
Protect my server

Verify a seller

Run a trading site or a Discord bot? Show your buyers whether a seller is ID-checked with us — live, and impossible for a scammer to fake, because the answer comes from proofofseller.xyz, not from whatever a seller pastes. Two ways: a drop-in badge, or the read API.

1. The embeddable badge (easiest)

Paste this iframe on your site. It renders our live badge for that seller — ID-checked, frozen (“do not pay”), or not-on-register — and always carries the server ID a buyer should confirm, as plain unclickable text. Because it’s an iframe served by us, the embedder can’t tamper with what it says.

<iframe src="https://proofofseller.xyz/embed/<handle>"
        title="Proof of Seller" width="360" height="160"
        frameborder="0" style="border:0;max-width:100%"></iframe>

Replace <handle> with the seller’s handle. A seller can copy their own snippet from their panel.

2. The read API (for bots & custom UI)

A friendly, cross-origin (CORS-open) status you can fetch from a browser or a bot:

GET https://proofofseller.xyz/api/v1/verify/<handle>

{
  "handle": "kaiden-mm",
  "name": "Kaiden",
  "status": "listed",          // "listed" | "frozen" | "unlisted"
  "idChecked": true,
  "frozen": false,
  "guildId": "784051923847561216",   // confirm THIS in the server
  "game": "adopt-me",
  "takingOrders": true,
  "verifiedProofs": 3,
  "recordUrl": "https://proofofseller.xyz/g/adopt-me/kaiden-mm",
  "signedRecordUrl": "https://proofofseller.xyz/api/v1/sellers/kaiden-mm/record"
}

Use it for display and quick checks. A frozen seller returns "status":"frozen" — surface that loudly and tell buyers not to pay.

3. The signed record (for cryptographic verification)

When you need proof you can trust without trusting the transport, fetch the Ed25519-signed canonical record and verify it against our published key. It carries a 15-minute TTL, so a replayed old record fails.

GET https://proofofseller.xyz/api/v1/sellers/<handle>/record   -> { payload, signature, keyId }
GET https://proofofseller.xyz/api/v1/keys                        -> { keys: [{ keyId, algorithm, publicKey }] }

Verify: fetch the record, look up keyId in /api/v1/keys, and check the base64 signature over the canonical JSON encoding of payloadwith Ed25519. Reject if the signature fails or payload.expiresAt has passed.

The one rule

Verification is pulled, never pushed. Never build a flow that trains a buyer to click a “verify me” link a seller handed them — a badge a seller can paste is a badge a scammer can paste. Send buyers to the register to check for themselves, or read the fact from these endpoints yourself. An ID check confirms identity; it is not an endorsement.

Building against this? Questions and integration help are in our Discord: join the server ↗.