🤖

Building with AI? Share the machine-readable version of this documentation directly with your AI coding assistant for faster integration.

View docs.md

Overview

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.

Authentication

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).

CORS & Cross-Origin Access

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.

Rate Limits

The free tier allows 100 requests per minute per API key. Rate limit information is included in every response via headers:

HeaderDescription
X-RateLimit-LimitMaximum requests per window (100)
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetISO timestamp when the window resets

Score Lookup

The primary endpoint for retrieving a user's complete WorldScore data including reputation score, verified credentials, and score breakdown.

GET/api/v1/score

Parameters

ParameterTypeRequiredDescription
walletstringRequiredThe user's World wallet address (0x...)

Response — User Found

{
  "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"
  }
}

Response — User Not Found

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"
}

Quick Verify

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.

GET/api/v1/verify

Parameters

ParameterTypeRequiredDescription
walletstringRequiredThe user's World wallet address (0x...)

Response

// User found
{
  "verified": true,
  "score": 750,
  "level": "high",
  "username": "alice_world"
}

// User not found
{
  "verified": false,
  "score": null,
  "level": null,
  "username": null
}

Public Stats

Aggregate statistics about the WorldScore network. No API key required.

GET/api/v1/stats

Response

{
  "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"
  }
}

Handling "User Not Found"

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);
}

Example UI for unverified users

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 TypeURLWhen to Use
Universal Link
✓ Recommended
https://world.org/mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451Works in all browsers, web apps, and mobile. Falls back gracefully.
World App Deep Linkworldapp://mini-app?app_id=app_fa8974b2c77a879724c770556d4a9451Only when you know the user has the World App installed (inside mini apps).

Integration Examples

// 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>

Score Breakdown

WorldScore ranges from 300 to 999. Here's how each verification credential contributes to the total score:

CredentialMax PointsDetails
ORB Verification150Must be verified via World Orb iris scan
External Wallet100$0 balance = 10pts, $1-$50 = 50pts, $50+ = 100pts
BAB Token100Must hold Binance BAB token in connected wallet
Wallet Analysis900 WLD = 10pts, 1-20 WLD = 30pts, 21-50 WLD = 60pts, 50+ WLD = 90pts
Phone Verification60Verify mobile number with OTP
X/Twitter50Connect and verify X/Twitter account
Email Verification40Verify email address
Referrals1001st = 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.

Verification Levels

LevelScore RangeRecommended Use
Low300 – 499Basic access, limited features
Medium500 – 699Standard access, moderate trust features
High700 – 999Full access, low/zero-collateral, premium features

Code Examples

JavaScript / Node.js

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
}

Python

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']}")

cURL

# 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/stats

Error Handling

The API uses standard HTTP status codes. All error responses include an error field with a human-readable message.

StatusMeaningWhat to Do
200SuccessCheck data — may be null if user not found
400Bad RequestCheck that wallet parameter is provided
401UnauthorizedCheck your API key is correct and active
429Rate LimitedWait until X-RateLimit-Reset timestamp, then retry
500Server ErrorRetry 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;
  }
}

Need Help?

Contact us at support@worldscore.world for API support, enterprise plans, or partnership inquiries.