सामग्री पर जाउ
Nymbot पर वापस

ज्ञान के आधार डेवलपरस

संतुलन, टॉप-अप आ चाबीसभ

चेक करू जे अहाँ लग की अछि, लाइटनिंग पर टॉप अप करू, अपन बटुआसँ स्वचालित रूपसँ टॉप अप करू, देखू जे प्रत्येक अनुरोधक लागत की अछि, आ कोडसँ चाबीक प्रबंधन करू।

बैलेंस चेक कऽ रहल छी

अहाँक दुनू शेष राशि, आ एहि कुंजीक टोपीक कतेक उपयोग कयल जाइत अछि।

GET https://nymbot.ai/api/v1/credits/balance - एकटा एपीआई कुंजीक आवश्यकता अछि। POST ई ओहि ग्राहकक लेल सेहो काज करैत अछि जे एकर अपेक्षा करैत छथि।

balance की वर्तमान बिटक्वाइन मूल्य पर डॉलरमे दुनू संतुलन एक सङ्ग अछि, ओहि उपकरणक लेल जे एकल सँख्याक अपेक्षा करैत अछि (null यदि दाम नहि पढ़ल जा सकैत अछि)। बाकी क्रेडिट आ सैट्समे अछि, एहि तरहेँ वास्तवमे शेष राशि राखल जाइत अछि। key ओहि चाबीक वर्णन करैत अछि जे पूछि गेल छल। एकटा चाबी जे अपन सीमा धरि पहुँच गेल अछि, तखन सेहो शेष राशि के जाँच कऽ सकैत अछि।

प्रतिक्रिया

{
  "balance": 49.18,
  "balance_sats": 42037,
  "standard": { "credits": 120.4, "sats": 1204 },
  "pro": { "credits": 408.33, "sats": 40833 },
  "key": {
    "id": "4f0c9a1be27d3856",
    "name": "laptop scripts",
    "limit_sats": 20000,
    "period_used_sats": 3412,
    "total_used_sats": 18230,
    "reset_period": "monthly",
    "reset_at": "2026-10-01T00:00:00Z"
  }
}
स्थितिकखन?
401चाबी गायब, अज्ञात, निरस्त या समाप्त भऽ गेल अछि।

cURL

curl https://nymbot.ai/api/v1/credits/balance \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os
import requests

res = requests.get(
    "https://nymbot.ai/api/v1/credits/balance",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
)
balance = res.json()
print(balance["standard"]["sats"], balance["pro"]["sats"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/credits/balance", {
  headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
const balance = await res.json();
console.log(balance.standard.sats, balance.pro.sats);

भुगतान विधि

अहाँ कोना टॉप अप कऽ सकैत छी, आ सीमा। बिजली एकमात्र तरीका अछि।

GET https://nymbot.ai/api/v1/topup/payment-methods - कोनो चाबीक आवश्यकता नहि अछि।

एकटा टॉप-अप 10 सँ 1,000,000 सैट्स होइत छैक; एकटा प्रो टॉप-अपकेँ कमसँ कम एकटा प्रो क्रेडिट कीनय पड़ैत छैक, तेँ ई 100 सैट्ससँ शुरू होइत छैक। डॉलरक सीमा बिटक्वाइनक दामक अनुसरण करैत छैक। bulk_bonus पैघ टॉप-अप पर अतिरिक्त क्रेडिट सूचीबद्ध करैत अछि, जे एप जकाँ अछिः 500,1,000 या 5,000 सैटक मानक टॉप-अप पर 10 प्रतिशत, 15 प्रतिशत या 20 प्रतिशत बेसी, आ 5,000,10,000 या 50,000 सैटक प्रो टॉप-अप पर।

प्रतिक्रिया

{
  "supported_methods": [
    {
      "method": "btc-lightning",
      "display_name": "Bitcoin Lightning",
      "supported_currencies": ["SATS", "USD", "BTC"],
      "limits": {
        "SATS": { "min": 10, "max": 1000000 },
        "USD": { "min": 0.02, "max": 1170 },
        "BTC": { "min": 1e-7, "max": 0.01 }
      },
      "tiers": ["standard", "pro"],
      "default_tier": "pro",
      "tier_min_sats": { "standard": 10, "pro": 100 },
      "sats_per_credit": { "standard": 10, "pro": 100 },
      "bulk_bonus": [
        { "bonus": 0.1, "standard_sats": 500, "pro_sats": 5000 },
        { "bonus": 0.15, "standard_sats": 1000, "pro_sats": 10000 },
        { "bonus": 0.2, "standard_sats": 5000, "pro_sats": 50000 }
      ]
    }
  ]
}

cURL

curl https://nymbot.ai/api/v1/topup/payment-methods

Python

import requests

methods = requests.get("https://nymbot.ai/api/v1/topup/payment-methods").json()
print(methods["supported_methods"][0]["limits"])

JavaScript

const methods = await (await fetch("https://nymbot.ai/api/v1/topup/payment-methods")).json();
console.log(methods.supported_methods[0].limits);

बिजली के ऊपर चढ़ना

लाइटनिंग इनवॉइस बनबैत अछि जे चाबीमे क्रेडिट जोड़ैत अछि। एकरा कोनो लाइटनिंग बटुआसँ भुगतान करू, तखन एकर जाँच करू। क्रेडिट जोड़ल जाए।

POST https://nymbot.ai/api/v1/topup/create/btc-lightning - एकटा एपीआई कुंजीक आवश्यकता अछि।

मैदानप्रकारआवश्यक अछि।वर्णन
amountसङ्ख्याहँकतेक मे। currency. सैटक लेल एकटा पूर्ण संख्या।
currencyस्ट्रिंगनहि।SATS (पूर्वनिर्धारित), USD अथवा BTCडॉलरकेँ वर्तमान बिटक्वाइनक दाम पर परिवर्तित कयल जाइत अछि।
tierस्ट्रिंगनहि।pro (पूर्वनिर्धारित) या standard: क्रेडिट कोन संतुलनमे जाइत अछि।

एकटा मानक क्रेडिट 10 सैट्स आ एकटा प्रो क्रेडिट 100 सैट्स अछि, सङ्गमे कोनो थोक बोनस। credits ई इनवॉइस की जोड़त अछि, ओ कहैत अछि।

प्रतिक्रिया

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
स्थितिकखन?
400मार्गमे एकटा आओर विधि (unsupported_method), एकटा अज्ञात मुद्रा (unsupported_currency) वा टियर, एकटा कमी भेल राशि, वा न्यूनतम राशि सँ कम राशि (amount_too_small), ऊपर 1,000,000 सैट्स (amount_too_large) या बिजली के बटुआ द्वारा मना कऽ देल गेल (amount_out_of_range).
429एक घंटामे एहि निमक लेल 60 सँ बेसी या एहि पता सँ 120 सँ बेसी चालान (rate_limit_exceeded, सँ Retry-After).
502एखन कोनो चालान नहि कयल जा सकैत अछि (invoice_unavailable, सँ Retry-After).

cURL

curl https://nymbot.ai/api/v1/topup/create/btc-lightning \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount": 10000, "currency": "SATS", "tier": "pro"}'

Python

import os
import requests

res = requests.post(
    "https://nymbot.ai/api/v1/topup/create/btc-lightning",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
    json={"amount": 10000, "currency": "SATS", "tier": "pro"},
)
invoice = res.json()
print(invoice["payment_request"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/topup/create/btc-lightning", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.NYMBOT_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ amount: 10000, currency: "SATS", tier: "pro" }),
});
const invoice = await res.json();
console.log(invoice.payment_request);

टॉप-अप जाँचि रहल अछि

ई पुछैत अछि जे की इनवॉइस के भुगतान कऽ देल गेल अछि आ एक बेर भऽ गेलाक बाद क्रेडिट जोड़ल जाइत अछि। जाँच करब ई अछि जे एकरा क्रेडिट कयल जाइत अछि, तेँ भुगतान के बाद, जाँच करू जे स्थिति ठीक नहि अछि। creditedबाद मे फेर सँ जाँच करब सुरक्षित छैः क्रेडिट एक बेर उतरै छै, चाहे अहाँ कतेक बेर पूछू।

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - चालान बनयबला एन. आई. एम. क चाबी चाही।

status अछि pending (एखन धरि भुगतान नहि कएल गेल अछि), paid (भुगतान कएल गेल अछि, मुदा एखन धरि जमा नै भेल अछि; फेर सँ जाँच करू), credited (अपन शेष राशि पर) या expired (समय पर भुगतान नहि कयल गेल)। शेष राशि ओहि स्तरक लेल अछि जकर ऊपर इनवॉइस रहैत अछि।

प्रतिक्रिया

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
स्थितिकखन?
400आई. डी. क्रिएट कॉलक 64-वर्णक आई. डी. नहि अछि।
404अहाँक एन. आई. एम. क लेल ओहि आई. डी. द्वारा कोनो चालान नहि अछि।invoice_not_found).

cURL

curl https://nymbot.ai/api/v1/topup/status/$INVOICE_ID \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os, time
import requests

headers = {"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]}
url = "https://nymbot.ai/api/v1/topup/status/" + invoice["invoice_id"]

while True:
    status = requests.get(url, headers=headers).json()["status"]
    if status in ("credited", "expired"):
        break
    time.sleep(3)
print(status)

JavaScript

const headers = { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY };
const url = "https://nymbot.ai/api/v1/topup/status/" + invoice.invoice_id;

let status;
do {
  await new Promise((r) => setTimeout(r, 3000));
  status = (await (await fetch(url, { headers })).json()).status;
} while (status !== "credited" && status !== "expired");
console.log(status);

पूछताछक इतिहास

प्रत्येक अनुरोधक लेल एक पंक्ति: ओ की छल, कोन मॉडल, कतेक टोकन आ ओकर लागत। कोनो प्रॉम्प्ट या उत्तर रखल नै जाइत अछि, त' कोनो वापस नै कएल जाइत अछि। पंक्ति सभ ९० दिन लेल राखल जाइत अछि, सब सँ नवीन पहिने। जे की (key) अपन सीमा पर पहुँचि गेल अछि, ओ अपन इतिहास पढ़ि सकैत अछि।

GET https://nymbot.ai/api/v1/queries/history — कें API की क आवश्यकता अछि, जे अपन स्वयंक अनुरोध देखैत अछि, वा एक हस्ताक्षरित अनुरोध अहाँक एन. आई. एम. सँ, जे सभ चाबी देखैत अछि।

मैदानप्रकारआवश्यक अछि।वर्णन
pageपूर्णांक (क्वेरी)नहि।डिफ़ॉल्ट 1, अधिकतम 1,000 पर; एकटा उच्च पृष्ठ अछि 400 invalid_value.
page_countपूर्णांक (क्वेरी)नहि।प्रति पृष्ठ पंक्ति। पूर्वनिर्धारित रूप सँ 20, बेसी सँ बेसी 100।
start_date
end_date
स्ट्रिंग (क्वेरी)नहि।आईएसओ 8601 तिथि या समय।
modelस्ट्रिंग (क्वेरी)नहि।केवल ई मॉडल।
typeस्ट्रिंग (क्वेरी)नहि।chat, responses, messages, image, video, speech, transcription अथवा embedding.
all_keysबूलियन (क्वेरी)नहि।एकटा चाबी सँग: true एकहि नामक प्रत्येक कुंजी सम्मिलित अछि। पूर्वनिर्धारित false.
key_idस्ट्रिंग (क्वेरी)नहि।हस्ताक्षरित अनुरोधक संग, या all_keys=true: केवल ई चाबी।

प्रतिक्रिया

{
  "data": [
    {
      "id": "q_71c4e9a0",
      "timestamp": "2026-09-30T08:12:00Z",
      "model": "anthropic/claude-sonnet-5",
      "type": "chat",
      "input_tokens": 1240,
      "output_tokens": 380,
      "cached_tokens": 0,
      "cost_sats": 16.2,
      "cost_usd": 0.01895,
      "balance": "pro",
      "key_id": "4f0c9a1be27d3856",
      "web_search": false,
      "status": "ok"
    }
  ],
  "pagination": { "page": 1, "page_count": 20, "total": 311, "total_pages": 16 }
}

cURL

curl "https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat" \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os
import requests

res = requests.get(
    "https://nymbot.ai/api/v1/queries/history",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
    params={"page_count": 50, "type": "chat"},
)
for row in res.json()["data"]:
    print(row["timestamp"], row["model"], row["cost_sats"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat", {
  headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
for (const row of (await res.json()).data) console.log(row.timestamp, row.model, row.cost_sats);

खाता अनुरोध पर हस्ताक्षर कऽ रहल छी।

कुंजी बनाब, बदलब आ रद्द करब, खाता सारांश आ स्वचालित टॉप-अप कोनो एपीआई कुंजी नहि लैत अछि। ओ अहाँक एनआईएम सँ हस्ताक्षर लैत अछि, तेँ एकटा लीक भेल कुंजी अपन सीमा तक खर्च कऽ सकैत अछि मुदा कहियो दोसर कुंजी नहि बना सकैत अछि या अपन सीमा नहि बढ़ा सकैत अछि।

एह ऐप अहाँक लेल ई करैत अछि: सब किछु ओहि में एपीआई शीट एहि अन्तिम बिन्दुक उपयोग करैत अछि। अहाँकेँ मात्र अपन कोडसँ कुंजीकेँ प्रबंधित करबाक लेल एहि खंडक आवश्यकता अछि।

हस्ताक्षर किनात् अछि एकटा Nostr इवेंट किंड 27235 (NIP-98), जे base64-encoded रूप में भेजल जाइत अछि Authorization शब्दक संग हेडर लगाउ। Nostr सामने:

घटना।

{
  "kind": 27235,
  "created_at": 1790726400,
  "tags": [
    ["u", "https://nymbot.ai/api/v1/keys"],
    ["method", "POST"],
    ["nonce", "9c4e21f07a3b...16 random bytes in hex"],
    ["payload", "3f1a0d7c8e2b...sha256 of the exact request body in hex"]
  ],
  "content": "",
  "pubkey": "your public key in hex",
  "id": "...",
  "sig": "..."
}
  • u ई अनुरोधक पूरा यूआरएल अछि, क्वेरी स्ट्रिंग शामिल अछि, जेना पठाओल गेल अछि।
  • method ई HTTP विधि अछि।
  • payload raw request body क SHA-256, hex में अछि। एकर आवश्यकता अछि on POST आओर PATCH, आ जे बॉडी अहाँ भेजैत छी ओ एकदम ओहिना होयत जे अहाँक हैश कएल छल।
  • created_at सर्वरक घड़ीक 60 सेकण्डक भीतर रहबाक चाही।
  • प्रत्येक कार्यक्रम एक बेर काज करैत अछि। GET एकरा सम्मिलित कयल गेल अछि, तेँ एकटा कैप्चर्ड हेडरकेँ फेरसँ चलाओल नहि जा सकैत अछि। प्रत्येक अनुरोधक लेल एकटा नव हस्ताक्षर करू। एकटा जोड़ू nonce यादृच्छिक मूल्यक संग टैग ताकि एकहि सेकंडमे हस्ताक्षरित दूटा अनुरोध तखन सेहो भिन्न होय।
  • एकटा हस्ताक्षरित अनुरोधक बॉडी अधिकतम 64 KB क भ' सकैत अछि, आ एकटा बॉडीक आवश्यकता अछि Content-Type: application/json.

एकटा लापता घटना वापस आबि जाइत अछि। 401 missing_nostr_auth; एकटा जे खराब बनाओल अछि, खराब हस्ताक्षर कएल अछि, बहुत पुरान अछि, या भिन्न URL, विधि या बॉडी लेल अछि, ओ वापस करैत अछि invalid_nostr_auth, सन्देशक कारणक संग; पुनः उपयोग कयल गेल एकटा वापस आबि जाइत अछि। nostr_auth_replayedएहि अन्तिम बिन्दु पर पठाओल गेल एकटा एपीआई कुंजी मना कऽ देल जाइत छैक। मुख्य भागकेँ पढ़बासँ पहिने हस्ताक्षरक जाँच कयल जाइत छैक, आ प्रत्येक पता एक मिनटमे 30 बेर विफल भऽ सकैत छैक (एकटा आईपीवी6 पता एकर सम्पूर्ण/64 मानल जाइत छैक); तकर बाद ई भऽ जाइत छैक। 429 संग-संग Retry-After.

ब्राउज़र एहि एंडपॉइंट्स केँ मात्र Nymbotक अपन साइट्स सं कॉल क' सकैत छै (https://nymbot.ai, https://nymchat.app अउर हुनकर सबडोमेन)। कोनो दोसर साइटक पेजक कोनो CORS हेडर नै मिलैत अछि, ताहि सँ ओ हुनकर वापस प्राप्त करबाक सामग्री नै पढ़ सकैत अछि। स्क्रिप्ट आ नेटिव एप्स, जे कोनो नै भेजैत अछि Origin, प्रभावित नै छथि।

अहाँक गुप्त चाबी

हस्ताक्षर करबाक लेल अहाँक एन. आई. एम. क गुप्त कुंजीक आवश्यकता होयत अछि। nsec), जे सब किछु नियंत्रित करैत अछि: अहाँक परिचय, अहाँक इतिहास आ अहाँक शेष राशि। एहि के मात्र ओहि मशीनक स्क्रिप्ट में राखू जकरा अहाँ विश्वास करैत छी, एहि के फाइल में लिखबाक बजाक वातावरण (environment) सँ पढ़ू, आ जखन संभव हो सकैत अछि, ऐप के प्राथमिकता दियौ।

ई सहायक हेडर बनबैत छथि। एहि पृष्ठक बादक उदाहरणमे एकर उपयोग कयल गेल अछि। ओ हेक्समे गुप्त कीकेँ हेक्ससँ पढ़ैत छथि। NOSTR_SECRET_HEX; सी. यू. आर. एल. क उपयोग करैत अछि nak कमांड-लाइन उपकरण, जे एन. एस. ई. सी. या हेक्स कुंजी लैत अछि, आ sha256sum (मैकोस पर, shasum -a 256).

cURL

nostr_auth() {
  method="$1"; url="$2"; body="$3"
  nonce=$(openssl rand -hex 16)
  if [ -n "$body" ]; then
    hash=$(printf '%s' "$body" | sha256sum | cut -d' ' -f1)
    event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce" -t "payload=$hash")
  else
    event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce")
  fi
  printf 'Nostr %s' "$(printf '%s' "$event" | base64 | tr -d '\n')"
}

Python

# pip install coincurve requests
import base64, hashlib, json, os, time
from coincurve import PrivateKey, PublicKeyXOnly

SECRET = bytes.fromhex(os.environ["NOSTR_SECRET_HEX"])

def nostr_auth(method, url, body=b""):
    pubkey = PublicKeyXOnly.from_secret(SECRET).format().hex()
    tags = [["u", url], ["method", method], ["nonce", os.urandom(16).hex()]]
    if body:
        tags.append(["payload", hashlib.sha256(body).hexdigest()])
    created_at = int(time.time())
    serialized = json.dumps([0, pubkey, created_at, 27235, tags, ""], separators=(",", ":"), ensure_ascii=False)
    event_id = hashlib.sha256(serialized.encode()).digest()
    event = {
        "id": event_id.hex(),
        "pubkey": pubkey,
        "created_at": created_at,
        "kind": 27235,
        "tags": tags,
        "content": "",
        "sig": PrivateKey(SECRET).sign_schnorr(event_id).hex(),
    }
    return "Nostr " + base64.b64encode(json.dumps(event).encode()).decode()

JavaScript

// npm install nostr-tools
import { createHash, randomBytes } from "node:crypto";
import { finalizeEvent } from "nostr-tools/pure";

const secret = Buffer.from(process.env.NOSTR_SECRET_HEX, "hex");

export function nostrAuth(method, url, body = "") {
  const tags = [["u", url], ["method", method], ["nonce", randomBytes(16).toString("hex")]];
  if (body) tags.push(["payload", createHash("sha256").update(body).digest("hex")]);
  const event = finalizeEvent(
    { kind: 27235, created_at: Math.floor(Date.now() / 1000), tags, content: "" },
    secret,
  );
  return "Nostr " + Buffer.from(JSON.stringify(event)).toString("base64");
}

लेखा सारांश

एपक एपीआई शीट शीर्ष पर की देखबैत छैः अहाँक सार्वजनिक कुंजी, दुनू शेष राशि, कतेक कुंजी सक्रिय छै (निरस्त या समाप्त नहि भेल), आ स्वचालित टॉप-अप सेटिंग्स, वा null जखन सर्वर ओकरा पेशकश नहि करैत अछि।

GET https://nymbot.ai/api/v1/account — कें एकटा आवश्यकता अछि हस्ताक्षरित अनुरोध.

प्रतिक्रिया

{
  "data": {
    "pubkey": "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
    "balances": {
      "standard": { "credits": 120.4, "sats": 1204 },
      "pro": { "credits": 408.33, "sats": 40833 }
    },
    "keys_active": 3,
    "nwc_auto_topup": {
      "connected": true, "threshold_sats": 5000, "topup_sats": 20000, "tier": "pro",
      "last_topup_at": null, "last_topup_sats": null, "last_error": null
    }
  }
}

cURL

URL=https://nymbot.ai/api/v1/account
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/account"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/account";
const res = await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } });
console.log(await res.json());

कुञ्जीक प्रबन्धन करू।

ऐपक की लिस्टक पाछाँ देल गेल एंडपॉइंट्स। ओकर सभकें एकटा चाहि हस्ताक्षरित अनुरोधआईएसओ 8601मे समय आ सैट्समे मात्राक सङ्ग प्रत्येक चाबी एहि रूपमे घुरायल जाइत अछि।

मुख्य वस्तु

{
  "id": "4f0c9a1be27d3856",
  "name": "laptop scripts",
  "hint": "sk-nymbot-Qm7x…c2Lw",
  "limit_sats": 20000,
  "reset_period": "monthly",
  "reset_at": "2026-10-01T00:00:00Z",
  "expire_at": null,
  "period_used_sats": 3412,
  "total_used_sats": 18230,
  "created_at": "2026-08-14T09:21:07Z",
  "updated_at": "2026-09-02T17:40:55Z",
  "last_used_at": "2026-09-30T08:12:00Z",
  "revoked_at": null
}

hint कोनो चाबीकेँ चिन्हबाक लेल पर्याप्त अछि मुदा एकर उपयोग करबाक लेल नहि। चाबीकेँ जखन बनाओल जाइत अछि तँ मात्र एक बेर फेरल जाइत अछि।

कुँजी सूचीबद्ध कय रहल

GET https://nymbot.ai/api/v1/keys - हस्ताक्षर कयल गेल।

मैदानप्रकारआवश्यक अछि।वर्णन
include_revokedबूलियन (क्वेरी)नहि।निरस्त कीकेँ सम्मिलित करू। पूर्वनिर्धारित false.

प्रतिक्रिया

{ "data": [ { "id": "4f0c9a1be27d3856", "name": "laptop scripts", "hint": "sk-nymbot-Qm7x…c2Lw", "...": "..." } ] }

cURL

URL=https://nymbot.ai/api/v1/keys
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/keys"
for key in requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"]:
    print(key["id"], key["name"], key["period_used_sats"], key["limit_sats"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys";
const { data } = await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json();
for (const key of data) console.log(key.id, key.name, key.period_used_sats, key.limit_sats);

केंची बनाबयब

POST https://nymbot.ai/api/v1/keys - हस्ताक्षर कयल गेल। वापसी भेल। 201.

मैदानप्रकारआवश्यक अछि।वर्णन
nameस्ट्रिंगहँ1 सँ 40 वर्ण, अहाँक अन्य सक्रिय कुंजीसँ भिन्न (केसकेँ अनदेखा करैत)।
limit_satsपूर्णांकनहि।सैट्समे खर्चक सीमा, कमसँ कम 1. एकरा बिना कोनो सीमा लेल छोड़ि दियौक।
reset_periodस्ट्रिंगनहि।daily, weekly अथवा monthlyजरूरत अछि। limit_satsएकरा एहन टोपी लेल छोड़ि दियौक जे कहियो रीसेट नहि होय।
expire_atस्ट्रिंग या पूर्णांकनहि।जखन कुंजी काज करब बन्द कऽ दैत छैकः एकटा आईएसओ 8601 समय, या 1970 सँ मिलीसेकण्ड।

जवाब (201)

{
  "data": {
    "id": "4f0c9a1be27d3856",
    "name": "laptop scripts",
    "hint": "sk-nymbot-Qm7x…c2Lw",
    "limit_sats": 20000,
    "reset_period": "monthly",
    "key": "sk-nymbot-Qm7x...c2Lw",
    "...": "the rest of the key object"
  }
}
स्थितिकखन?
400एकटा नाम गायब अछि वा बहुत लम्बा अछि; एकटा नाम जे पहिले सँ प्रयोग भऽ रहल अछि (duplicate_name); एकटा सीमा जे कम से कम १ केर पूर्ण संख्या नहि अछि; बिना सीमाक एकटा रीसेट अवधि; भूतकालमे एकटा समाप्ति; एकटा अपरिचित फ़ील्ड (unknown_parameter); या 25 सक्रिय कुंजी पहिनेसँ (too_many_keys).
429एहि नाम सँ ६० सँ बेसी की (keys) कऽ गेल, वा एहि पता सँ १२०, एक घंटा में (rate_limit_exceeded, सँ Retry-After).

cURL

URL=https://nymbot.ai/api/v1/keys
BODY='{"name":"laptop scripts","limit_sats":20000,"reset_period":"monthly"}'
curl "$URL" \
  -H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Python

import json
import requests

url = "https://nymbot.ai/api/v1/keys"
body = json.dumps({"name": "laptop scripts", "limit_sats": 20000, "reset_period": "monthly"}).encode()
res = requests.post(
    url,
    data=body,
    headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"]["key"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys";
const body = JSON.stringify({ name: "laptop scripts", limit_sats: 20000, reset_period: "monthly" });
const res = await fetch(url, {
  method: "POST",
  headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
  body,
});
console.log((await res.json()).data.key);

एकटा मुख्य पढ़ैत छी

GET https://nymbot.ai/api/v1/keys/{id} - हस्ताक्षर कयल गेल।

वापसी। {"data": {…}} मुख्य वस्तुक संगे, वा 404 key_not_found जँ अहाँक कोनो चाबीमे ओ आईडी नहि अछि।

cURL

URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
console.log((await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json()).data);

एकटा चाबी बदलि रहल अछि।

PATCH https://nymbot.ai/api/v1/keys/{id} - हस्ताक्षर कयल गेल।

कोनो एकटा पठाउ। name, limit_sats, reset_period आओर expire_at, ओही नियमक संग जखन चाबी बनाओल जाइत अछि। null एकटा क्षेत्र साफ कऽ दैत अछि: कोनो सीमा नै, कोनो रिसेट नै, कोनो समाप्ति नै। रिसेट अवधि केँ बदलला सँ शून्य सँ एकटा नव अवधि शुरू भऽ जाइत अछि। एकटा रद्द कएल की (key) केँ बदलल नै जा सकैत अछि (400 key_revoked)। वापसी। {"data": {…}} अद्यतन मुख्य वस्तुक संग।

cURL

URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
BODY='{"limit_sats":50000,"expire_at":null}'
curl -X PATCH "$URL" \
  -H "Authorization: $(nostr_auth PATCH "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Python

import json
import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
body = json.dumps({"limit_sats": 50000, "expire_at": None}).encode()
res = requests.patch(
    url,
    data=body,
    headers={"Authorization": nostr_auth("PATCH", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const body = JSON.stringify({ limit_sats: 50000, expire_at: null });
const res = await fetch(url, {
  method: "PATCH",
  headers: { "Authorization": nostrAuth("PATCH", url, body), "Content-Type": "application/json" },
  body,
});
console.log((await res.json()).data);

एकटा चाबीकेँ निरस्त कयल जा रहल अछि।

DELETE https://nymbot.ai/api/v1/keys/{id} - हस्ताक्षर कयल गेल।

चाबीकेँ तुरन्त रोकि दैत अछि, नीक लेल। ई सूचीमे बनल रहैत अछि। revoked_at सेट, आ संग देखल जा सकैत अछि include_revoked=trueपहिनेसँ रद्द कयल गेल चाबीकेँ निरस्त कयलासँ सेहो ओही उत्तर भेटैत अछि। केवल नवीनतम 50 रद्द कयल गेल चाबीकेँ राखल जाइत अछि; जखन दोसर चाबीकेँ रद्द कयल जाइत अछि तखन पुरानकेँ हटा देल जाइत अछि।

प्रतिक्रिया

{ "data": { "id": "4f0c9a1be27d3856", "revoked": true } }

cURL

URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());

एन. डब्ल्यू. सी. ऑटो-टॉप-अप

Connect a Lightning wallet with Nostr Wallet Connect and Nymbot tops up a balance by itself when API spending runs it low. The app's API sheet has the same settings; these are the endpoints behind it. All of them need a हस्ताक्षरित अनुरोध.

How it works: after an API request is charged to the balance you chose to watch, if that balance has fallen below your threshold, Nymbot makes an invoice for your top-up amount, asks your wallet to pay it, and adds the credit. It tops up at most once every 5 minutes for each nym and balance, so a burst of requests cannot drain the wallet. Spending in the apps does not trigger it. The time and size of the last top-up, and the last error, are in the settings; if a payment went through after an error, checking its invoice with टॉप-अपक स्थिति एकरा श्रेय दियौ।

तौहाँ वॉलेट जोड़बा सँ पहिने

A connection string lets whoever holds it ask your wallet to pay. Nymbot stores it encrypted and only ever uses it to pay its own top-up invoices, but make a connection just for this, with a spending budget in your wallet, so the most it could ever pay is a number you chose. The wallet has to support pay_invoice.

वॉलेट जोड़बयैत अछि

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect - हस्ताक्षर कयल गेल।

मैदानप्रकारआवश्यक अछि।वर्णन
nwc_urlस्ट्रिंगहँकनेक्शन स्ट्रिंग, शुरू भऽ रहल अछि। nostr+walletconnect://. Nymbot asks the wallet for get_info एकरा सुरक्षित कए सँ पहिने, आ एकरा एन्क्रिप्ट कए कए संचय कयैत अछि।
threshold_satsपूर्णांकहँजखन शेष राशि एते बेसी सैट्ससँ नीचा खसय तखन टॉप अप करू। कमसँ कम 1,000।
topup_satsपूर्णांकहँहर बेर कतेक जोड़बाक अछि। 1,000 सँ 1,000,000 sats.
tierस्ट्रिंगनहि।pro (पूर्वनिर्धारित) या standard: देखबाक आ ऊपर उठयबाक संतुलन।

प्रतिक्रिया

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
स्थितिकखन?
400कनेक्शन स्ट्रिंग नहि अछि (invalid_nwc_url); बटुआ अपन रिले पर जवाब नहि देलक (nwc_unreachable) अथवा चेकसँ मना कऽ देलनि (nwc_rejected); कनेक्शन बिलक भुगतान नहि कऽ सकैत अछि (nwc_missing_permission); अथवा सीमा सँ बाहर कोनो राशि।
501एहि सर्वर लेल स्वचालित टॉप-अप चालू नै अछि (nwc_unavailable). यही बात अन्य दूटा अन्तिम बिन्दु पर लागू होइत अछि।

cURL

URL=https://nymbot.ai/api/v1/nwc-auto-topup/connect
BODY='{"nwc_url":"nostr+walletconnect://...","threshold_sats":5000,"topup_sats":20000,"tier":"pro"}'
curl "$URL" \
  -H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Python

import json, os
import requests

url = "https://nymbot.ai/api/v1/nwc-auto-topup/connect"
body = json.dumps({
    "nwc_url": os.environ["NWC_URL"],
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
}).encode()
res = requests.post(
    url,
    data=body,
    headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json())

JavaScript

const url = "https://nymbot.ai/api/v1/nwc-auto-topup/connect";
const body = JSON.stringify({
  nwc_url: process.env.NWC_URL,
  threshold_sats: 5000,
  topup_sats: 20000,
  tier: "pro",
});
const res = await fetch(url, {
  method: "POST",
  headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
  body,
});
console.log(await res.json());

सेटिंग्स पढ़ब।

GET https://nymbot.ai/api/v1/nwc-auto-topup - हस्ताक्षर कयल गेल।

ओहि वस्तुकेँ वापस करैत अछि जे कनेक्टिंग करैत अछि, सङ्ग connected: false आ अन्य क्षेत्रसभ null जखन कोनो बटुआ कनेक्टेड नहि रहैत अछि। कनेक्शन स्ट्रिंग स्वयं कहियो वापस नहि अबैत अछि।

cURL

URL=https://nymbot.ai/api/v1/nwc-auto-topup
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/nwc-auto-topup"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/nwc-auto-topup";
console.log(await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json());

अलग भ' रहल छी

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection - हस्ताक्षर कयल गेल।

भंडारित कनेक्शन स्ट्रिंगकेँ हटा दैत अछि। आओर कोनो टॉप-अप नहि कयल जाइत अछि। सुनिश्चित करबाक लेल, अहाँ अपन बटुआमे कनेक्शनकेँ सेहो रद्द कऽ सकैत छी।

प्रतिक्रिया

{ "data": { "connected": false, "threshold_sats": null, "topup_sats": null, "tier": null, "last_topup_at": null, "last_topup_sats": null, "last_error": null } }

cURL

URL=https://nymbot.ai/api/v1/nwc-auto-topup/connection
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/nwc-auto-topup/connection"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/nwc-auto-topup/connection";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());

बिना चाबीके प्रति अनुरोध भुगतान करब।

स्थिर मूल्यक अन्तिम बिन्दुक भुगतान लाइटनिंग पर एक बेरमे एकटा अनुरोधक लेल कयल जा सकैत अछि, जाहिमे कोनो चाबी नहि, कोनो खाता नहि आ कोनो शेष राशि नहि रहैत छैकः POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations आओर POST /embeddingsगपशप, प्रतिक्रिया आ सन्देशक लेल हमेशा एकटा चाबी आवश्यक होइत छैक। एकटा अनुरोध जाहिमे चाबी रहैत छैक, ओकरा सामान्य जकाँ शेष राशि पर बिल देल जाइत छैक; भुगतानक प्रवाह तखनि शुरू होइत छैक जखन कोनो चाबी नहि पठाओल जाइत छैक।

Nymbot speaks two versions of the same idea, from one backend: Lightning Labs' L402 (also accepted under its old name, LSAT) आ आई. ई. टी. एफ. मसौदा भुगतान एच. टी. टी. पी. प्रमाणीकरण योजना lightning विधि आ charge इरादा। जेकर प्रयोग अहाँक क्लाइंट बुझैत छथि, ओही के प्रयोग करू।

अहाँक अपन सर्वर चलाबयब

बिना चाबीके भुगतान तखनि चालू होइत अछि जखन API_L402_SECRET कम से कम ३२ रैंडम बाइट्स सहेले अछि, हेक्स (६४ अक्षर) वा बेस६४ (४४) के रूप में। एकटा बनाउ openssl rand -hex 32एकटा छोट या अनुमानित मान फीचरकेँ बंद कऽ दैत अछि आ लॉग करैत अछि कि किएक। एकरा घुमयबाक लेल पुरान मानकेँ आगू बढ़ाउ। API_L402_SECRET_PREVIOUS एक दिनक लेल: क्रेडेंशियल, स्टेटस URL आ ओकरा तहत कएल गेल चुनौती एक्सपायर होबय तक काम करैत रहत।

चुनौती

अनुरोध नहि पठाउ। Authorization हेडर। यदि ई वैध अछि, किछु नहि चलैत अछि, आ अहाँकेँ भेटत। 402 Payment Required एकटा इनवॉइस के संग ठीक ओहि अनुरोधक लागत के लेलः ओही दाम जे एकटा चाबी भुगतान करत, 10 सैट्स पर एक मानक क्रेडिट या 100 सैट्स पर एक प्रो क्रेडिट मे परिवर्तित भऽ कऽ पूरा सैट्स (कम सँ कम 1 सैट्स, आ कम सँ कम 0.05 क्रेडिट न्यूनतम) तक गोल भऽ जायत छैक। जवाब मे तीन होइत छैक। WWW-Authenticate एकहि इनवॉइस लेल चुनौतीः

HTTP/1.1 402 Payment Required
Content-Type: application/problem+json; charset=utf-8
Cache-Control: no-store
WWW-Authenticate: L402 macaroon="AgJC...", invoice="lnbc2370n1..."
WWW-Authenticate: LSAT macaroon="AgJC...", invoice="lnbc2370n1..."
WWW-Authenticate: Payment id="kM9x...", realm="nymbot", method="lightning", intent="charge",
    request="eyJhbW91bnQiOiIyMzciLC...", description="Nymbot API POST /images/generations (237 sats)",
    digest="sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:", expires="2026-09-30T12:15:00.000Z",
    opaque="eyJlbmRwb2ludCI6IlBPU1QgL2ltYWdlcy9nZW5lcmF0aW9ucyJ9"

{
  "type": "https://paymentauth.org/problems/payment-required",
  "title": "Payment Required",
  "status": 402,
  "detail": "This request costs 237 sats. Pay the Lightning invoice, then send the identical request again ...",
  "challengeId": "kM9x...",
  "amount_sats": 237,
  "invoice": "lnbc2370n1...",
  "payment_hash": "9db1370f...",
  "expires_at": "2026-09-30T12:15:00.000Z",
  "error": { "message": "This request costs 237 sats. ...", "type": "payment_required", "code": "payment_required", "param": null }
}

भुगतान request पैरामीटर बेस64यूआरएल जेएसओएन अछिः {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

एकटा चुनौती अन्तिम बिन्दुसँ जुड़ल रहैत अछि। Content-Type (एकर मीडिया प्रकार आ, मल्टिपार्टक लेल, एकर सीमा) आ सटीक बॉडी बाइटक एसएचए-256 पर जे अहाँ पठा रहल छी, आ 15 मिनट धरि चलैत अछि। भुगतानक बाद, पठाउ समान फेर सँ अनुरोध: ओही सँ Content-Type आ समान जे. एस. ओ. एन. बाइट्स, वा बहुपक्षीय अन्तिम बिन्दुक लेल (/images/edits, /audio/transcriptions, /audio/translations) एकहि सीमा वला एकहि बहु-भाग निकाय। बेसी एचटीटीपी पुस्तकालय प्रत्येक बेर जखन कोनो प्रपत्रकेँ कूटबद्ध करैत अछि तखन एकटा नव सीमा चुनैत अछि, तेँ एकरा एक बेर कूटबद्ध करू आ ओहि बाइट्सकेँ दू बेर पठाउ।

Each address can ask for 30 challenges a minute (an IPv6 address counts as its whole /64). Requests whose address is not known share a stricter 10 a minute, and there is an overall cap on the challenges Nymbot issues across all addresses; a request refused before a challenge is made (for example with a body that is not valid JSON) does not count toward it. Beyond that the answer is 429 संग-संग Retry-After, शरीर पढ़ला सँ पहिने भेजल जाइत अछि। बिना कोनो की (key) वा क्रेडेंशियल के कॉल कएल गेल पेड एंडपॉइंट्स सेहो प्रति एड्रेस प्रति मिनट १२0 अनऑथेंटिकेटेड रिक्वेस्ट क सामान्य सीमा में गिनाएल जाइत अछि। बॉडी पढ़ला सँ पहिने क्रेडेंशियल चेक कएल जाइत अछि, आ एकटा रिक्वेस्ट जकर Content-Type नाइ छै application/json (वा multipart/form-data अपलोड करय लेल अस्वीकार कएल गेल अछि 415 आ कखनो नहि पाबयछ एकटा इनवॉइस।

एम्बेडिंगक मूल्य इनपुटमे टोकनक अनुमानसँ एकटा 1.5× मार्जिनक सङ्ग निर्धारित कयल जाइत अछि, किएक तँ वास्तविक गणना बादमे ज्ञात होयत अछि। अहाँ वास्तवमे उपयोग कयल गेल टोकनक लेल भुगतान करैत छी, आ भुगतानक अप्रयुक्त भागक मूल्यक हिसाबसँ वापस आबि जाइत अछि। रिफंड टोकन.

भुगतान पठा रहल छी।

कोनो बिजली के बटुआ सँ इनवॉइस के भुगतान करू। बटुआ अहाँ केँ 64 हेक्स कैरेक्टर के प्रीमेज दैत अछि। फेर ओहि अनुरोध केँ एहि मे सँ एक के संग पठाउः

योजनाशीर्षक
L402Authorization: L402 <macaroon>:<preimage> (LSAT काम सेहो करैत अछि)
भुगतानAuthorization: Payment <base64url JSON>, जतय JSON अछि {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

एहि एकटा सशुल्क अनुरोध (paid request) एकटा की (key) सँ कएल गेल अनुरोध जकां सेहो ठीक उत्तर दैत अछि, बस एतय... nymbot ऑब्जेक्ट में कोनो बैलेंस फील्ड नै अछि: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}, अउर कोनो नै अछि X-Nymbot-Balance-Sats हेडर। एकटा पेमेंट स्कीम सँ भुगतान कएल गेल रिक्वेस्ट केँ सेहो एकटा Payment-Receipt हेडर (base64url चैलेंज आईडी सहित JSON, भुगतान हैश क रूप में reference, status आओर timestamp). सशुल्क अनुरोध कोनो nym सँ जुड़ल नै छै, तहि सँ ओ सब क्वेरी हिस्ट्री (query history) मे नै देखाइत छै।

स्थितिकखन?
402 payment_already_usedप्रत्येक भुगतान एक अनुरोधक लेल भुगतान करैत अछि। प्रतिक्रिया एहि अनुरोधक लेल एकटा नवा चुनौती अछि, ताहि लेल एकटा क्लाइंट जे अपन अन्तिम क्रेडेंशियल कए कैश करैत अछि (जहिना lnget करैत) बस फेर सँ भुगतान करैत अछि।
402 payment_mismatchक्रेडेंशियल दूसर पाँत (endpoint) लेल जारी कएल गेल छल, Content-Type या निकाय, या एहि अनुरोधसँ कम भुगतान आब लागत अछि। एहि अनुरोधक लेल एकटा नव चुनौती एकर संग अबैत अछि; यदि भुगतान बहुत कम छल, तऽ अहाँ जे भुगतान कयलहुँ से एकर रूप मे वापस आबि जायत अछि। रिफंड टोकन (refund_token आओर refund_sats शरीर मे)।
402 payment_expiredचुनौतीकें बाद १५ मिनट सं बेसी बीति गेल अछि। एकटा नव चुनौती एकरा संग आबैत अछि। यदि प्रीइमेज (preimage) अहाँकें देखाबैत अछि जे अहाँ भुगतान कएलहुँ, तँ जे अहाँ भुगतान कएलहुँ छल ओ एकटा वापस आबैत अछि रिफंड टोकन (refund_token आओर refund_sats शरीर में, एक बेर; ओकर बादcredential समाप्त भ' जाइत अछि।
401 invalid_preimageपूर्वचित्र चालानक भुगतान हैशकेँ हैश नहि करैत अछि। भुगतान समाप्त नहि होइत अछि।
401 invalid_payment_credentialThe credential is malformed, was changed after Nymbot issued it, or names a payment hash Nymbot never issued an invoice for. A macaroon with a caveat Nymbot does not know, or with conflicting caveats, is refused.
429 rate_limit_exceededएक मिनट में एहि पता सं ३० सँ बेसी क्रेडेंशियल या की (keys) वेरिफिकेशन में फेल भऽ गेल, या एकटा रिफंड टोकन एक मिनट में ६० सँ बेसी बेर भेजल गेल। प्रतीक्षा करू Retry-After.

cURL

BODY='{"model":"nano-banana","prompt":"a lighthouse at dusk","response_format":"b64_json"}'
URL=https://nymbot.ai/api/v1/images/generations

# 1. Get the challenge
CH=$(curl -s -D - -o /dev/null "$URL" -H "Content-Type: application/json" -d "$BODY" | grep -i '^www-authenticate: L402')
MAC=$(echo "$CH" | sed -E 's/.*macaroon="([^"]+)".*/\1/')
INVOICE=$(echo "$CH" | sed -E 's/.*invoice="([^"]+)".*/\1/')

# 2. Pay $INVOICE with your wallet and copy the preimage
PREIMAGE=...

# 3. Send the identical request with the credential
curl "$URL" -H "Content-Type: application/json" -H "Authorization: L402 $MAC:$PREIMAGE" -d "$BODY"

lnget

# lnget (Lightning Labs) pays L402 challenges from your own lnd node and retries for you
lnget -X POST -H "Content-Type: application/json" \
  -d '{"model":"nano-banana","prompt":"a lighthouse at dusk","response_format":"b64_json"}' \
  https://nymbot.ai/api/v1/images/generations

Python

import base64, json, re
import requests

url = "https://nymbot.ai/api/v1/images/generations"
body = json.dumps({"model": "nano-banana", "prompt": "a lighthouse at dusk", "response_format": "b64_json"}).encode()
headers = {"Content-Type": "application/json"}

challenge = requests.post(url, data=body, headers=headers)
assert challenge.status_code == 402
info = challenge.json()
print("Pay", info["amount_sats"], "sats:", info["invoice"])

preimage = pay_with_your_wallet(info["invoice"])  # 64 hex characters

# L402
mac = re.search(r'L402 macaroon="([^"]+)"', challenge.headers["WWW-Authenticate"]).group(1)
res = requests.post(url, data=body, headers={**headers, "Authorization": f"L402 {mac}:{preimage}"})
print(res.json()["nymbot"])

JavaScript

const url = "https://nymbot.ai/api/v1/images/generations";
const body = JSON.stringify({ model: "nano-banana", prompt: "a lighthouse at dusk", response_format: "b64_json" });
const headers = { "Content-Type": "application/json" };

const challenge = await fetch(url, { method: "POST", headers, body });
const www = challenge.headers.get("www-authenticate");

// The Payment scheme: echo every challenge parameter back with the preimage
const start = www.indexOf("Payment ");
const params = Object.fromEntries([...www.slice(start + 8).matchAll(/(\w+)="((?:[^"\\]|\\.)*)"/g)].map((m) => [m[1], m[2]]));
const { invoice } = JSON.parse(Buffer.from(params.request, "base64url").toString()).methodDetails;
const preimage = await payWithYourWallet(invoice);

const credential = Buffer.from(JSON.stringify({ challenge: params, payload: { preimage } })).toString("base64url");
const res = await fetch(url, { method: "POST", headers: { ...headers, Authorization: `Payment ${credential}` }, body });
console.log((await res.json()).nymbot, res.headers.get("payment-receipt"));

निर्मित ग्राहकसभ mppx लाइटनिंग विधिसँ भुगतान चुनौतीकेँ स्वयं सँभालू; ओकरा अंतिम बिन्दु पर इंगित करू आ ओकरा भुगतान करय दियौक।

वीडियोसभ

भुगतान कयल गेल। POST /videos जवाब दियौक। 202 एक चाबीदार के तरह, प्लस ए status_url: GET ई बिना कोनो चाबी के काज के पालन करै लेल अछि। ई हस्ताक्षरित अछि आ 24 घंटा धरि काज करैत अछि, जाबत धरि काज राखल जाइत अछि।

{
  "id": "vid_...",
  "status": "in_progress",
  "status_url": "https://nymbot.ai/api/v1/videos/vid_...?exp=1790000000&sig=...",
  "nymbot": {
    "payment": "l402", "tier": "pro", "paid_sats": 4800, "charged_sats": 4800,
    "refund_token": "REFUND-5E0B..."
  }
}

रखू तऽ refund_token एहि प्रतिक्रिया सं: ई मात्र एतहि देखाइत अछि। जब तक वीडियो रेंडर नहि होइत अछि, ई खाली रहैत अछि (GET /api/v1/l402/refunds जवाब दियौक। "status": "pending"); यदि रेंडर अनबिल्ड (unbilled) रूप में विफल भ' जाइत अछि, तँ भुगतान ओहि पर आ जाइत अछि। स्टेटस URL देखबैत अछि refund_sats रिफंड कयल गेल नौकरीक लेल मुदा कखनहु टोकन नहि, तेँ स्थिति यूआरएल साझा करबासँ रिफंड साझा नहि होयत अछि। टोकनक जाँच करब एकटा असफल काजकेँ सेहो तय करैत अछि जकरा कोनो मतदान नहि कयलक।

धन वापसी

If a paid request fails and the provider billed Nymbot for the attempt, the payment is kept and the error says so, with charged_satsठीक कोनो कुंजी अनुरोधक लेल। यदि ई बिना बिल देल जाए विफल भऽ जाइत अछि तखन त्रुटि एकटा वहन करैत अछि रिफंड टोकन अहाँ जे भुगतान कयलहुँ ओकर मूल्य अछिः

{
  "error": {
    "message": "The image generator failed. Nothing was charged. Please try again. The 237 sats you paid are on refund token REFUND-...",
    "type": "api_error",
    "code": "upstream_error",
    "refund_token": "REFUND-0C15DBED145D59131BA70298A413ADEB3D9B9AB082C476EA70A5BD38FCA5DE6D",
    "refund_sats": 237,
    "refund_expires_at": "2026-10-30T12:00:00.000Z"
  }
}

अप्रयुक्त पुर्जे ओहि तरहेँ वापस आबि जाइत अछिः जँ अहाँ दूटा चित्र माँगि लेलहुँ आ एकटा बिना बिलक असफल भऽ गेल तँ सफलताक प्रतिक्रिया अछि nymbot वस्तु मे लापता के लेल रिफंड टोकन होइत छैक; एकटा ट्रांसक्रिप्शन जकर लंबाई केँ सामने पढ़ा नहि जा सकैत छैक, ओकर कीमत फाइलक सबसँ लम्बा (30 मिनट सँ बेसी कहियो नहि) भऽ सकैत छैक, आ वास्तविक लंबाई के अंतर रिफंड टोकन के रूप मे वापस आबि जायत छैक; यदि ई 30 मिनट सँ बेसी होइत छैक, तऽ एकरा मना कऽ देल जायत छैक। 413 आ पूरा भुगतान वापस आबि जाइत अछि। एम्बेडिंग ओहि वस्तुकेँ वापस कऽ दैत अछि जे अनुमानमे राखल गेल छल। एकटा असफल वीडियो टोकनकेँ ओकर सबमिशनकेँ वापस कऽ दैत अछि।

A refund token is a random 256-bit code. Nymbot stores only its hash, and it expires after 30 days. It holds a sat balance, and you can:

  • एकर भुगतान करू। पठाउ ] Authorization: Bearer REFUND-… ऊपरक कोनो अन्तिम बिन्दु पर (एकटा ओपनएआई एसडीके एकरा अपन एपीआई कुंजीक रूपमे लैत अछि)। मूल्य टोकनसँ निकलैत अछि आ जे शेष रहैत अछि से ओहि पर रहैत अछि (refund_token_sats ओहि मे nymbot वस्तु)। अनुरोधक उत्तरसँ कम मूल्यक टोकन। 402 refund_insufficient; एकटा अनबिल विफलता सैट्सकेँ ओहि टोकन पर वापस राखि दैत छैक।
  • एकर जाँच करू। GET /api/v1/l402/refunds एकहि हेडरसँ वापसी होइत अछि। {"sats": 237, "status": "open", "expires_at": "..."}.
  • एकटा टोकन के एक मिनट में अधिकतम 60 बेर प्रयोग कएल जा सकैत अछि।
  • एकरा एकटा निम पर लऽ जाउ। एकरा चिपकाइ दियौक। कोनो उपहार फेरू। in the Nymbot app, or call POST /api/v1/l402/refunds/redeem एकटा संग हस्ताक्षरित अनुरोध आओर {"refund_token": "REFUND-...", "balance": "standard"} (वा "pro"). पूरा क्रेडिट शेष राशिमे जाइत अछि (प्रत्येक मानक पर 10 सैट्स, प्रो पर 100 सैट्स); जे सैट्स पूरा क्रेडिट नहि दैत अछि ओ एपीआई अनुरोधक लेल टोकन पर रहैत अछि।

cURL

URL=https://nymbot.ai/api/v1/l402/refunds/redeem
BODY='{"refund_token":"REFUND-...","balance":"standard"}'
curl "$URL" \
  -H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

प्रतिक्रिया

{ "data": { "credited": 23, "tier": "standard", "balance_credits": 123, "remaining_sats": 7 } }