GlurkGlurkDocs
For developers

Build on Glurk in five minutes.

Three integration paths depending on what you're building. The chain is the source of truth — every path below reads the same on-chain state and returns the same identity.

01 · Verify a wallet

GET /api/v1/check

Public REST endpoint. Returns Glurk Score, credential count, issuer count, and the full credential list for any wallet. No auth, no SDK install, no language binding required.

Try it · GET /api/v1/check

live:
test mode:

cURL

curl 'https://glurk.slayerblade.site/api/v1/check?wallet=test:approve'

# Returns a synthetic profile with score 600 + finlit credentials.
# Swap the wallet for any real Solana address in production.

JavaScript / TypeScript

// In tests, point at any test:<scenario> for deterministic data.
const wallet = process.env.NODE_ENV === 'test'
  ? 'test:approve'
  : walletAddress;

const res = await fetch(
  `https://glurk.slayerblade.site/api/v1/check?wallet=${wallet}`,
);
const { glurkScore, credentials } = await res.json();

Python

import requests

r = requests.get(
    "https://glurk.slayerblade.site/api/v1/check",
    params={"wallet": wallet_address},
)
data = r.json()
print(data["glurkScore"], data["credentialCount"])

Go

url := "https://glurk.slayerblade.site/api/v1/check"
resp, _ := http.Get(url + "?wallet=" + wallet)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)

Test mode · deterministic fixtures

no auth · no chain read · part of /api/v1 contract

Pass test:<scenario> as the wallet to skip the chain read and get a synthetic-but-shape-identical profile. Built so you can write CI tests for high-score / low-score / no-profile cases without hunting for real wallets in those exact states. Responses include "test": true so your code can branch if needed.

WalletScoreCreds
test:empty00
test:reject1201
test:edge3002
test:approve6003
test:elite10005
test:hire-ready1752

Scenario names and their numeric outputs are stable within v1. Responses also set the X-Glurk-Test-Mode header. Try them in the playground above.

Errors & response headers

All errors return { "ok": false, "error": "<message>" } with the appropriate HTTP status. Handle these in your integration:

StatusWhen
400missing or malformed wallet/email
401invalid / deactivated API key
404no wallet linked to that email
429monthly quota exceeded
500RPC or backend issue

Every response (success and error) sets these headers — read them client-side to pace requests and show usage in your own UI:

HeaderMeaning
X-Glurk-Tieranonymous · free · pro · enterprise
X-Glurk-Quota-Totalmonthly call cap for this tier
X-Glurk-Quota-Remainingcalls left this month (or unlimited for anonymous)
X-Glurk-Test-Modeset to true on test:* sentinel responses

Response shape

{
  "ok": true,
  "wallet": "BqHe...gagT",
  "glurkScore": 425,        // 0-1000
  "credentialCount": 5,
  "issuerCount": 2,
  "credentials": [{
    "issuer": "BqHe...gagT",
    "slug": "credit-score",
    "tier": "gold",
    "score": 90,
    "timestamp": 1714123456,
    "pda": "..."
  }],
  "network": "devnet",
  "generatedAt": 1714134567
}

Cached s-maxage=30, stale-while-revalidate=120. CORS open. Versioned under /api/v1; existing fields are stable within v1.

02 · Embed a verification badge

One iframe. Zero JS deps.

For sites that want to surface a wallet's Glurk identity without doing their own rendering. Drop the iframe in, point at any wallet, done.

<iframe src="https://glurk.slayerblade.site/embed/<wallet>"
        width="360" height="180"
        frameborder="0"
        style="border-radius:16px"></iframe>

Renders a card with the Glurk Score, credential count, and three most recent credentials. Background is transparent so it inherits the host page color. Updates live from chain on every request.

03 · TypeScript SDK

@glurk-protocol/sdk

For TypeScript apps that want typed access to the chain. Skips the REST layer and reads program accounts directly. Lower latency, no protocol cache.

npm i @glurk-protocol/sdk

import { GlurkClient, calcGlurkScore } from '@glurk-protocol/sdk';

const client = new GlurkClient('https://api.devnet.solana.com');
const profile = await client.getProfile(userWallet);

console.log(profile.glurkScore, profile.credentials.length);

Also exports calculateDynamicCollateral for lending integrations and calcGlurkScore for client-side score computation. Same formula as the on-chain consumers.

04 · Issue credentials (you become an issuer)

Permissionless registration.

The on-chain register_issuer instruction has no protocol-admin gate. Any wallet can pay rent and become an issuer authority. Two paths:

Browser flow

/issuers/register →

Connect Phantom, name your issuer, sign once. Done in 60 seconds, no code required.

Programmatic

SDK + Anchor

await program.methods
  .registerIssuer("Your Name")
  .accounts({
    admin: wallet.publicKey,
    issuerAuthority: wallet.publicKey,
  })
  .rpc();

Protocol reference

Program ID

5FVzW7QwuETtRnBfXom3b2Rxd2R6weo1285Fywg66fCQ

Network

Solana Devnet

RPC

https://api.devnet.solana.com

Source

github.com/sb-arnav/glurk ↗

Building something on Glurk? Open an issue on GitHub or DM the founder.