The WorldScore API allows you to verify users and access their reputation scores within the World (formerly Worldcoin) ecosystem. With 65,000+ verified unique humans, WorldScore provides the most comprehensive reputation layer for World mini apps.
Base URL: https://developer.worldscore.world/api/v1
All responses are in JSON format. The API is RESTful and uses standard HTTP methods.
All API endpoints (except /stats) require an API key. Include your key in the X-API-Key header:
curl -H "X-API-Key: ws_live_your_api_key_here" \
https://developer.worldscore.world/api/v1/score?wallet=0x...You can also pass the key as a query parameter: ?api_key=ws_live_... (less secure, not recommended for production).
The API supports CORS from any origin. You can call the API directly from browser-based apps, mobile WebViews, server-side applications, or any environment — no proxy or backend needed.
// Works directly from any browser or frontend app
const response = await fetch(
"https://developer.worldscore.world/api/v1/score?wallet=0x...",
{ headers: { "X-API-Key": "ws_live_your_key" } }
);Exposed headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset are accessible from browser JavaScript.
The free tier allows 100 requests per minute per API key. Rate limit information is included in every response via headers:
| Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests per window (100) |
| X-RateLimit-Remaining | Requests remaining in current window |
| X-RateLimit-Reset | ISO timestamp when the window resets |
The primary endpoint for retrieving a user's complete WorldScore data including reputation score, verified credentials, and score breakdown.
| Parameter | Type | Required | Description |
|---|---|---|---|
| wallet | string | Required | The user's World wallet address (0x...) |
{
"success": true,
"data": {
"walletAddress": "0x1234...abcd",
"username": "alice_world",
"totalScore": 750,
"isVerified": true,
"verificationLevel": "high", // "low" | "medium" | "high"
"country": { // null if phone not verified
"code": "US",
"name": "United States"
},
"credentials": {
"orbVerified": true, // 150 points
"emailVerified": true, // 40 points
"phoneVerified": true, // 60 points
"externalWallet": {
"connected": true,
"points": 100 // 10-100 based on balance
},
"babTokenHolder": false, // 100 points
"twitterVerified": true, // 50 points
"walletAnalysis": {
"completed": true,
"points": 60 // 10-90 based on WLD balance
},
"referrals": {
"count": 3,
"points": 50 // up to 100
}
},
"scoreBreakdown": {
"orbVerification": 150,
"externalWallet": 100,
"emailVerification": 40,
"phoneVerification": 60,
"twitterVerification": 50,
"babToken": 0,
"walletAnalysis": 60,
"referrals": 50
},
"memberSince": "2026-01-15T10:30:00.000Z",
"lastActive": "2026-07-29T14:22:00.000Z"
}
}When the wallet address is not registered on WorldScore, the API returns data: null. This is a 200 OK response — not an error. See the User Not Found guide for how to handle this.
{
"success": true,
"data": null,
"message": "User not found in WorldScore database"
}A lightweight endpoint for simple boolean verification checks. Use this when you only need to know if a user is registered and their score level.
| Parameter | Type | Required | Description |
|---|---|---|---|
| wallet | string | Required | The user's World wallet address (0x...) |
// User found
{
"verified": true,
"score": 750,
"level": "high",
"username": "alice_world"
}
// User not found
{
"verified": false,
"score": null,
"level": null,
"username": null
}Aggregate statistics about the WorldScore network. No API key required.
{
"success": true,
"data": {
"totalUsers": 65471,
"averageScore": 520,
"verifications": {
"emails": 48230,
"phones": 31540,
"babTokens": 8920
},
"scoreRange": { "min": 300, "max": 999 },
"lastUpdated": "2026-07-30T07:00:00.000Z"
}
}When a wallet address doesn't exist in WorldScore's database, the API returns "data": nullwith a 200 status. This means the user hasn't registered and verified on the WorldScore app yet.
What you should do as a developer: When data is null, guide the user to verify themselves on the WorldScore app. You can show a friendly message with a button that deep-links directly to the WorldScore mini app inside the World App.
const response = await fetch(
`https://developer.worldscore.world/api/v1/score?wallet=${userWallet}`,
{ headers: { "X-API-Key": "ws_live_your_key" } }
);
const { data } = await response.json();
if (data === null) {
// User not found — show a "Verify on WorldScore" prompt
showVerificationPrompt();
} else {
// User found — use their score
console.log("Score:", data.totalScore);
console.log("Level:", data.verificationLevel);
}Show a card or modal prompting the user to get their WorldScore:
<!-- HTML example for your mini app -->
<div class="verify-prompt">
<h3>Get Your WorldScore</h3>
<p>Verify your identity on WorldScore to access premium features.</p>
<!-- Universal Link (works everywhere — recommended) -->
<a href="https://world.org/mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451"
class="verify-button">
Verify on WorldScore →
</a>
</div>Use these links to redirect users to the WorldScore mini app inside the World App, where they can complete their verification and increase their score.
| Link Type | URL | When to Use |
|---|---|---|
| Universal Link ✓ Recommended | https://world.org/mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451 | Works in all browsers, web apps, and mobile. Falls back gracefully. |
| World App Deep Link | worldapp://mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451 | Only when you know the user has the World App installed (inside mini apps). |
// JavaScript — redirect user to WorldScore
function redirectToWorldScore() {
// Universal Link — works everywhere (recommended)
window.location.href =
"https://world.org/mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451";
}
// React component example
function VerifyPrompt() {
return (
<div className="verify-card">
<h3>Get Verified on WorldScore</h3>
<p>Complete your verification to unlock features.</p>
<a
href="https://world.org/mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451"
className="verify-btn"
>
Open WorldScore →
</a>
</div>
);
}<!-- Inside a World Mini App (use deep link for instant navigation) -->
<a href="worldapp://mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451">
Get Your WorldScore
</a>
<!-- For web apps or external sites (use universal link) -->
<a href="https://world.org/mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451"
target="_blank">
Verify on WorldScore
</a>WorldScore ranges from 300 to 999. Here's how each verification credential contributes to the total score:
| Credential | Max Points | Details |
|---|---|---|
| ORB Verification | 150 | Must be verified via World Orb iris scan |
| External Wallet | 100 | $0 balance = 10pts, $1-$50 = 50pts, $50+ = 100pts |
| BAB Token | 100 | Must hold Binance BAB token in connected wallet |
| Wallet Analysis | 90 | 0 WLD = 10pts, 1-20 WLD = 30pts, 21-50 WLD = 60pts, 50+ WLD = 90pts |
| Phone Verification | 60 | Verify mobile number with OTP |
| X/Twitter | 50 | Connect and verify X/Twitter account |
| Email Verification | 40 | Verify email address |
| Referrals | 100 | 1st = 10pts, 2nd = 15pts, 3rd = 25pts, 4th = 50pts |
Base score: All users start with 300 points (ORB verified through World ID). Maximum achievable score is 999 with all verifications and 4+ referrals.
| Level | Score Range | Recommended Use |
|---|---|---|
| Low | 300 – 499 | Basic access, limited features |
| Medium | 500 – 699 | Standard access, moderate trust features |
| High | 700 – 999 | Full access, low/zero-collateral, premium features |
async function getWorldScore(walletAddress) {
const response = await fetch(
`https://developer.worldscore.world/api/v1/score?wallet=${walletAddress}`,
{ headers: { "X-API-Key": "ws_live_your_api_key_here" } }
);
const { success, data, message } = await response.json();
if (!success) {
throw new Error("API request failed");
}
if (data === null) {
// User not registered on WorldScore
return {
found: false,
// Redirect user to WorldScore app to get verified
verifyUrl: "https://world.org/mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451"
};
}
return {
found: true,
score: data.totalScore,
level: data.verificationLevel,
orbVerified: data.credentials.orbVerified,
breakdown: data.scoreBreakdown,
};
}
// Usage
const result = await getWorldScore("0x1234...abcd");
if (!result.found) {
// Show: "Verify on WorldScore to continue"
window.location.href = result.verifyUrl;
} else if (result.score >= 600) {
// Grant access to premium features
}import requests
def get_worldscore(wallet_address, api_key):
response = requests.get(
"https://developer.worldscore.world/api/v1/score",
params={"wallet": wallet_address},
headers={"X-API-Key": api_key}
)
result = response.json()
if not result.get("success"):
raise Exception("API request failed")
data = result.get("data")
if data is None:
return {"found": False, "message": "User not on WorldScore"}
return {
"found": True,
"score": data["totalScore"],
"level": data["verificationLevel"],
"orb_verified": data["credentials"]["orbVerified"],
}
# Usage
score_data = get_worldscore("0x1234...abcd", "ws_live_your_key")
if not score_data["found"]:
print("User needs to verify on WorldScore first")
elif score_data["score"] >= 700:
print(f"High trust user: {score_data['score']}")# Full score lookup
curl -X GET \
"https://developer.worldscore.world/api/v1/score?wallet=0x1234...abcd" \
-H "X-API-Key: ws_live_your_api_key_here"
# Quick verification check
curl -X GET \
"https://developer.worldscore.world/api/v1/verify?wallet=0x1234...abcd" \
-H "X-API-Key: ws_live_your_api_key_here"
# Public stats (no API key needed)
curl https://developer.worldscore.world/api/v1/statsThe API uses standard HTTP status codes. All error responses include an error field with a human-readable message.
| Status | Meaning | What to Do |
|---|---|---|
200 | Success | Check data — may be null if user not found |
400 | Bad Request | Check that wallet parameter is provided |
401 | Unauthorized | Check your API key is correct and active |
429 | Rate Limited | Wait until X-RateLimit-Reset timestamp, then retry |
500 | Server Error | Retry after a few seconds. If persistent, contact support. |
// Error response format
{
"error": "API key required",
"message": "Include your API key in the X-API-Key header or as api_key query parameter"
}
// Robust error handling example
async function safeScoreLookup(wallet, apiKey) {
try {
const res = await fetch(
`https://developer.worldscore.world/api/v1/score?wallet=${wallet}`,
{ headers: { "X-API-Key": apiKey } }
);
if (res.status === 429) {
const retryAfter = res.headers.get("X-RateLimit-Reset");
console.warn("Rate limited, retry after:", retryAfter);
return null;
}
if (!res.ok) {
const err = await res.json();
throw new Error(err.error || "Unknown error");
}
return await res.json();
} catch (error) {
console.error("WorldScore API error:", error.message);
return null;
}
}Contact us at support@worldscore.world for API support, enterprise plans, or partnership inquiries.