Nod Citynod.city
Exchanges
Wallets
All WalletsHardware WalletsSoftware WalletsLightning WalletsSpark WalletsMultisig WalletsCashu Wallets
Privacy Tools
All Privacy ToolsVPNeSIMPassword Managers2-Factor AuthenticationSearch EnginesEncrypted MessagingAd Blockers
ConferencesAll CategoriesList Your Service
Block: ---₿ ---
nod.city· Trust the nod.
HomeExchangesWalletsAll CategoriesList Your ServiceAPI

Built on Nostr. Reviews you own.·Built by @notgui

On this page

  • Powered by Nostr
  • Overview
  • Errors & Rate Limits

Public API

  • List Services
  • Get Service
  • Service Reviews
  • All Reviews

Business API

  • Getting Started
  • Create API Key
  • List API Keys
  • Revoke API Key
  • Create Invitation
  • List Invitations
  • Embeddable Widget
  • Reply to Review

Other

  • Attribution

Nod City API v1

Read ratings and reviews with the Public API, or collect and manage reviews with the Business API. Built for integrators, wallets, and service owners.

Powered by Nostr

Every review on Nod City is a signed Nostr event (kind 31986) published to open relays. The data is decentralized, censorship-resistant, and cryptographically verifiable. Anyone can read it directly from relays using the Nostr protocol.

So why use this API?

  • Pre-aggregated ratings. Average scores and review counts computed and ready to display.
  • Enriched metadata. Service info, categories, founders, and author profiles joined in a single response.
  • Search & filtering. Query by category, name, or date range with pagination.
  • Simple REST. One HTTPS GET instead of managing WebSocket connections to multiple relays.

Think of this API as a convenience layer on top of Nostr, not a replacement. Every event_id in our responses is a real Nostr event you can verify on any relay.

Overview

Base URLhttps://nod.city/api/v1
FormatJSON
CORSOpen to all origins. Call the API directly from browser JavaScript.
Public APINo authentication. Read-only access to services, ratings, and reviews.
Business APIRequires Authorization: Bearer <api-key>. Create invitation links, reply to reviews, and embed widgets.

Errors & Rate Limits

60 requests per minute per IP (public) or per API key (business). When exceeded, the API returns 429 with a Retry-After header.

Error format

// All errors return JSON with an "error" field:
{
  "error": "Rate limit exceeded. Try again in 60 seconds."
}

// Common status codes:
// 400  Bad Request       — invalid parameters or malformed body
// 401  Unauthorized      — missing or invalid API key / session
// 403  Forbidden         — you don't own this resource
// 404  Not Found         — service, review, or invitation not found
// 409  Conflict          — invitation already used
// 429  Too Many Requests — rate limit exceeded

Building something that needs higher limits? Let us know. We're happy to help.

Public API

No authentication required. Read-only access to services and reviews.

GET/api/v1/services

List all services with ratings. Supports search and category filtering. Ordered by review count.

Parameters

qstringSearch by name, slug, or description
categorystringFilter by category slug (e.g. "wallets", "exchanges")
limitintegerResults per page (default 30, max 100)
offsetintegerPagination offset (default 0)

Request

curl https://nod.city/api/v1/services?category=wallets&limit=3

Response

{
  "services": [
    {
      "slug": "phoenix",
      "name": "Phoenix",
      "description": "...",
      "website": "https://phoenix.acinq.co",
      "category": "wallets",
      "tags": ["Lightning", "Non-custodial"],
      "logo_url": "https://nod.city/logos/phoenix.png",
      "x_handle": "PhoenixWallet",
      "average_rating": 4.2,
      "review_count": 15,
      "url": "https://nod.city/service/phoenix"
    }
  ],
  "total": 45,
  "limit": 3,
  "offset": 0
}
GET/api/v1/services/:slug

Get full details for a single service, including founders and the 5 most recent reviews. A single call gives integrators everything they need.

Request

curl https://nod.city/api/v1/services/phoenix

Response

{
  "slug": "phoenix",
  "name": "Phoenix",
  "description": "...",
  "website": "https://phoenix.acinq.co",
  "category": "wallets",
  "tags": ["Lightning", "Non-custodial"],
  "logo_url": "https://nod.city/logos/phoenix.png",
  "x_handle": "PhoenixWallet",
  "nostr_pubkey": "abc123...",
  "average_rating": 4.2,
  "review_count": 15,
  "url": "https://nod.city/service/phoenix",
  "founders": [
    { "x_handle": "aaborrell", "nostr_pubkey": "def456..." }
  ],
  "recent_reviews": [
    {
      "event_id": "...",
      "content": "Great wallet for Lightning payments.",
      "rating": 5,
      "author": {
        "pubkey": "...",
        "display_name": "Alice",
        "picture": "https://..."
      },
      "created_at": "2026-04-01T12:00:00Z"
    }
  ]
}
GET/api/v1/services/:slug/reviews

Paginated reviews for a specific service with full author profiles including NIP-05 verification.

Parameters

limitintegerResults per page (default 30, max 100)
offsetintegerPagination offset (default 0)

Request

curl https://nod.city/api/v1/services/phoenix/reviews?limit=5

Response

{
  "reviews": [
    {
      "event_id": "...",
      "content": "...",
      "rating": 4,
      "author": {
        "pubkey": "...",
        "display_name": "Alice",
        "picture": "https://...",
        "nip05": "alice@example.com"
      },
      "created_at": "2026-04-01T12:00:00Z",
      "url": "https://nod.city/review/..."
    }
  ],
  "total": 15,
  "limit": 5,
  "offset": 0,
  "service": {
    "slug": "phoenix",
    "name": "Phoenix",
    "average_rating": 4.2
  }
}
GET/api/v1/reviews

Recent reviews across all services. The since parameter is useful for incremental sync. Poll periodically and only fetch new reviews.

Parameters

categorystringFilter by service category
sincestringISO 8601 datetime. Only returns reviews after this time.
limitintegerResults per page (default 30, max 100)
offsetintegerPagination offset (default 0)

Request

curl https://nod.city/api/v1/reviews?category=wallets&limit=5

Response

{
  "reviews": [
    {
      "event_id": "...",
      "content": "...",
      "rating": 4,
      "author": {
        "pubkey": "...",
        "display_name": "Alice",
        "picture": "https://...",
        "nip05": "alice@example.com"
      },
      "created_at": "2026-04-01T12:00:00Z",
      "url": "https://nod.city/review/...",
      "service": {
        "slug": "phoenix",
        "name": "Phoenix",
        "category": "wallets"
      }
    }
  ],
  "total": 312,
  "limit": 5,
  "offset": 0
}

Business API

Tools for service owners to collect reviews, reply to feedback, and embed ratings. All endpoints require an API key.

Getting Started

  1. 1
    Claim your service. Go to your service page on nod.city, log in with X, and verify ownership via DNS TXT record, HTML meta tag, or X account matching.
  2. 2
    Create an API key. POST /api/v1/business/api-keys with your session cookie. Save the key — it's shown only once.
  3. 3
    Use the API key as a Bearer token. Pass Authorization: Bearer YOUR_KEY on every business endpoint.
POST/api/v1/business/api-keys

Create a new API key for a service you own. Requires an active X session cookie. The full key is returned only once — store it securely.

Parameters

service_slugstringrequiredThe slug of the service you own
namestringA label for this key (e.g. "Production")

Request

curl -X POST https://nod.city/api/v1/business/api-keys \
  -H "Cookie: x_session=YOUR_SESSION" \
  -H "Content-Type: application/json" \
  -d '{"service_slug": "phoenix", "name": "Production"}'

Response

{
  "id": 1,
  "key": "a1b2c3d4e5f6...full-64-char-hex-key...",
  "key_prefix": "a1b2c3d4",
  "service_slug": "phoenix",
  "name": "Production",
  "created_at": "2026-04-06T12:00:00.000Z"
}
GET/api/v1/business/api-keys

List all API keys you've created. Returns masked keys (prefix only, never the full key). Requires X session cookie.

Request

curl https://nod.city/api/v1/business/api-keys \
  -H "Cookie: x_session=YOUR_SESSION"

Response

{
  "api_keys": [
    {
      "id": 1,
      "key_prefix": "a1b2c3d4",
      "service_slug": "phoenix",
      "name": "Production",
      "created_at": "2026-04-06T12:00:00.000Z",
      "last_used_at": "2026-04-06T14:30:00.000Z",
      "revoked_at": null
    }
  ]
}
DELETE/api/v1/business/api-keys/:id

Revoke an API key. The key immediately stops working. This cannot be undone. Requires X session cookie.

Request

curl -X DELETE https://nod.city/api/v1/business/api-keys/1 \
  -H "Cookie: x_session=YOUR_SESSION"

Response

{ "ok": true }
POST/api/v1/business/invitations

Generate a unique review invitation link. Embed this URL in your own emails or order confirmations. Customers still must log in (X or Nostr) to submit a review — no customer PII is shared with Nod City.

Parameters

reference_idstringYour internal reference (e.g. order ID). Optional, for your tracking.
redirect_uristringURL to show a "Return to business" link after review. Optional.

Request

curl -X POST https://nod.city/api/v1/business/invitations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reference_id": "order-123", "redirect_uri": "https://example.com/thanks"}'

Response

{
  "id": 42,
  "url": "https://nod.city/service/phoenix/review?invite=abc123...",
  "token": "abc123def456789012345678abcdef00",
  "service_slug": "phoenix",
  "reference_id": "order-123",
  "redirect_uri": "https://example.com/thanks",
  "created_at": "2026-04-06T12:00:00.000Z"
}
GET/api/v1/business/invitations

List invitation links for your service with their status. Use this to track which invitations have been used.

Parameters

limitintegerResults per page (default 30, max 100)
offsetintegerPagination offset (default 0)

Request

curl https://nod.city/api/v1/business/invitations?limit=10 \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "invitations": [
    {
      "id": 42,
      "token": "abc123...",
      "reference_id": "order-123",
      "redirect_uri": "https://example.com/thanks",
      "status": "used",
      "created_at": "2026-04-06T12:00:00.000Z",
      "reviewed_at": "2026-04-06T15:30:00.000Z"
    },
    {
      "id": 43,
      "token": "def456...",
      "reference_id": "order-124",
      "redirect_uri": null,
      "status": "pending",
      "created_at": "2026-04-06T13:00:00.000Z",
      "reviewed_at": null
    }
  ],
  "limit": 10,
  "offset": 0
}

Embeddable Widget

Add a rating badge to any website with two lines of HTML. No API key required — the widget uses the public API.

<div data-nod-slug="phoenix"></div>
<script src="https://nod.city/widget.js" async defer></script>

For dark backgrounds, add data-nod-theme="dark" to the div.

Preview

★★★★☆4.2/5· 15 reviewsNod City →
★★★★☆4.2/5· 15 reviewsNod City →
POST/api/v1/business/reviews/:eventId/reply

Reply to a review as the business owner. You sign the Nostr event (kind 1111) yourself and send it to us. We verify the signature, publish to relays, and cache the reply. The review must belong to your service.

Parameters

signed_eventobjectrequiredA fully signed Nostr kind 1111 event. Must include an E tag referencing the review's event ID.

Request

curl -X POST https://nod.city/api/v1/business/reviews/REVIEW_EVENT_ID/reply \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "signed_event": {
      "id": "...",
      "pubkey": "your-nostr-pubkey",
      "kind": 1111,
      "created_at": 1712400000,
      "content": "Thank you for the review!",
      "tags": [["K", "31986"], ["E", "REVIEW_EVENT_ID", "", ""]],
      "sig": "..."
    }
  }'

Response

{
  "event_id": "...",
  "created_at": "2026-04-06T12:00:00.000Z"
}

Attribution

If you display Nod City ratings in your app or website, please include a visible attribution: "Powered by Nod City" with a link back to the service page.

Contact

Questions about the API or want to discuss an integration? Reach out on X @nodcity or via Nostr.