PubScore
Notifications
No notifications yet

PubScore API

Public, read-only API for Nostr review data. No authentication required. All reviews are cryptographically signed, validated, and spam-filtered.

https://api.pubscore.space Public

Endpoints

GET
/reviews?npub={npub}
Full reviews for a profile — vote (trusted/neutral/avoid), text, categories, reviewer, timestamp.
GET
/score?npub={npub}
Lightweight score only — average rating + review count + vote breakdown.
GET
/scores?npubs={npub1,npub2,...}
Batch scores for up to 200 npubs in a single request.
GET
/leaderboard?window={all|week|month}&limit={n}
Top rated profiles. Window filters by time period, limit caps results (max 1000).
GET
/leaderboard/tag?tag={tag}&window={all|week|month}
Everyone tagged with a category. Tags: trade, knowledge, helpful, funny, creative, warning.
GET
/health
API status, uptime, review count, ingester stats.
GET
/reviews/recent?npub={npub}&since={timestamp}&limit={n}
Recent validated reviews. All params optional. Use for notifications and activity feeds.
GET
/reviews/by?npub={npub}
All reviews written by a given npub — subjects, ratings, text, categories.
DELETE
/reviews/{id}?npub={npub}
Delete a review from the API database. Only the original reviewer can delete their own.

Example: Get a score

fetch('https://api.pubscore.space/score?npub=npub1...') .then(r => r.json()) .then(data => { console.log(data.avgRating) // 4.3 console.log(data.count) // 17 console.log(data.votes) // { trusted: 14, neutral: 2, avoid: 1 } })

Example: Batch scores

const npubs = ['npub1abc...', 'npub1def...'] const url = `https://api.pubscore.space/scores?npubs=${npubs.join(',')}` const { scores } = await fetch(url).then(r => r.json()) // scores['npub1abc...'] = { avgRating: 4.3, count: 17 }

Example: Full reviews

const { reviews, avgRating, count } = await fetch( 'https://api.pubscore.space/reviews?npub=npub1...' ).then(r => r.json()) reviews.forEach(r => { console.log(r.reviewer, r.rating, r.content) // rating is 'trusted', 'neutral', or 'avoid' })

Example: Recent reviews (notifications)

// Get new reviews since last check const since = Math.floor(Date.now() / 1000) - 3600 // last hour const { reviews } = await fetch( `https://api.pubscore.space/reviews/recent?npub=npub1...&since=${since}` ).then(r => r.json()) reviews.forEach(r => { console.log(r.reviewer, r.rating, r.created_at) // rating is 'trusted', 'neutral', or 'avoid' })

Validation Rules

Every review stored in the API has passed these checks:

✓ Valid Nostr event signature

✓ Reviewer has ≥30 followers

✓ Rating is trusted, neutral, or avoid

✓ No self-reviews

✓ One review per reviewer per profile

✓ Max 50 reviews per reviewer per day

Rate Limits

120 requests per minute per IP. No authentication needed.

CORS

Open to all origins. Use it from any frontend, app, or script.

Open Source

The API is open source. View on GitHub →

Sign in to see your review history
fama volat
Sign in to see scores for people you follow

Sign in

Connect your Nostr identity to leave reviews.

Scan or paste in your remote signer
or
⚠️ Using your private key in a web app carries inherent risk. If this site were ever compromised, your key could be exposed. A browser extension like nos2x or Alby is always the safer option.

Just want to browse?

Open source on GitHub
Embed your PubScore
Markdown (GitHub, READMEs)
HTML (websites, blogs)