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
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 contractPass 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.
| Wallet | Score | Creds |
|---|---|---|
| test:empty | 0 | 0 |
| test:reject | 120 | 1 |
| test:edge | 300 | 2 |
| test:approve | 600 | 3 |
| test:elite | 1000 | 5 |
| test:hire-ready | 175 | 2 |
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:
| Status | When |
|---|---|
| 400 | missing or malformed wallet/email |
| 401 | invalid / deactivated API key |
| 404 | no wallet linked to that email |
| 429 | monthly quota exceeded |
| 500 | RPC 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:
| Header | Meaning |
|---|---|
| X-Glurk-Tier | anonymous · free · pro · enterprise |
| X-Glurk-Quota-Total | monthly call cap for this tier |
| X-Glurk-Quota-Remaining | calls left this month (or unlimited for anonymous) |
| X-Glurk-Test-Mode | set 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
Building something on Glurk? Open an issue on GitHub or DM the founder.