सामग्री पर चल जाईं
निम्बोट पर वापस जाओ

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

बैलेंस, टॉप-अप अउर चाभी

देखऽ राउर का बा, Lightning पर टॉप अप करऽ, अपना वॉलेट से अपने आप टॉप अप करऽ, देखऽ कि हर रिक्वेस्ट के कतनो लागत लागल, आ कोड से कीज़ के मैनेजमेंट करऽ।

बैलेंस चेक कइल जा रहल बा

रउआ दुनो के बैलेंस, अउर एह चाभी के कतना कैप इस्तेमाल भइल बा।

GET https://nymbot.ai/api/v1/credits/balance — के API key के जरूरत बा। POST ओकरा से काम भी चलेला, उ क्लाइंट सभ खातिर जे ओकर उम्मीद करेले।

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

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{
  "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);

एस. ए. आर. भुगतान विधियाँ

रउआ कइसे टॉप अप कऽ सकत बानी, आ एकर सीमा का बा। लाइटनिंग (Lightning) एकमात्र तरीका बा।

GET https://nymbot.ai/api/v1/topup/payment-methods — कवनो चाबी के जरूरत नईखे।

एगो टॉप-अप 10 से 1,000,000 sats तक होला; एगो Pro टॉप-अप के कम से कम एगो Pro क्रेडिट खरीदे के पड़ी, त ई 100 sats से शुरू होला। डॉलर के सीमा बिटकॉइन के दाम के हिसाब से चलत बा। bulk_bonus बड़हन टॉप-अप पर अतिरिक्त क्रेडिट के सूची देवेला, जइसन ऐप में बा: 500, 1,000 चाहे 5,000 sats से शुरू होखे वाला स्टैंडर्ड टॉप-अप पर 10%, 15% चाहे 20% बेसी, अउर Pro टॉप-अप पर 5,000, 10,000 चाहे 50,000 sats से शुरू होखे वाला।

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{
  "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);

लाइटनिंग से टॉप-अप कइल

एगो लाइटनिंग इनवॉइस बनाव जे ओही nym में क्रेडिट जोड़ देखेकरु जेकर पास चाबी बा। एकरा के कवनो भी लाइटनिंग वॉलेट से चुका दऽ, ओकरा बाद एके देख लीं क्रेडिट जुड़वावे के खातिर।

POST https://nymbot.ai/api/v1/topup/create/btc-lightning — के API key के जरूरत बा।

खेतप्रकारजरूरी बाविवरण
amountआर. ए. आर. नंबरहॅंंकितियो, इन currencyसैट्स खातिर एगो पूरा संख्या।
currencyडोरीना.SATS (पूर्वनिर्धारित), USD ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. BTCडॉलर के बिटकोइन के ताजा कीमत पर बदलल जाला।
tierडोरीना.pro (जे डिफ़ॉल्ट बा) चाहे standard: कवन बैलेंस में क्रेडिट जाई।

एक मानक क्रेडिट 10 सैट्स है और एक प्रो क्रेडिट 100 सैट्स है, साथ ही कोई भी थोक बोनस; credits एस. आर. आई. आर. ने बताया कि यह चालान क्या जोड़ेगा।

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{
  "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 sats से ऊपर (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} — ओही नमन (nym) से एगो कुंजी (key) चाहीं जे बिल बनावले रहे।

status खैर है pending (एखनओ भुगतान नहीं किया गया है), paid (भुगतान, लेकिन अभी तक जमा नहीं; फिर से जाँच करें), credited (अपने बैलेंस पर) या expired ₹ (समय पर भुगतान नहीं किया गया). शेष राशि उस स्तर के लिए है जिस स्तर पर चालान शीर्ष पर है।

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{
  "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);

खोज के इतिहास

प्रति अनुरोध के लिए एक पंक्तिः यह क्या था, कौन सा मॉडल, कितने टोकन और इसकी कीमत क्या है। कोई संकेत या उत्तर नहीं रखे जाते हैं, इसलिए कोई भी वापस नहीं किया जाता है। पंक्तियों को 90 दिनों के लिए रखा जाता है, सबसे नया पहले। एक कुंजी जो अपनी टोपी तक पहुंच गई है वह अभी भी अपना इतिहास पढ़ सकती है।

GET https://nymbot.ai/api/v1/queries/history r------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - हस्ताक्षरित अनुरोध तोहरा नाम से, जवन हर चाबी के देखला।

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

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{
  "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);

खाते अनुरोधों पर हस्ताक्षर करना

की, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता सारांश, खाता

एप राउर खातिर ई करेला: सब कुछ अपना API शीट ई एंडपॉइंट्स के इस्तेमाल करेला। रउआ के खाली ई सेक्शन के जरूरत बा अपना कोड से कीज़ (keys) के मैनेज करे खातिर।

हस्ताक्षर एगो 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 ई रिक्वेस्ट के पूरा URL हऽ, क्वेरी स्ट्रिंग के साथे, ठीक ओइसहीं जइसन भेजल गइल रहे।
  • method ई HTTP मेथड हऽ।
  • payload हेक्सास में, कच्चे अनुरोध निकाय का SHA-256 है। यह पर आवश्यक है। POST औरी PATCH, अउर जे बॉडी राउर भेजे के बा, उ बाइट दर बाइट ओही के जेकर राउर हैश कइले बानी।
  • created_at सर्वर के घड़ी के साथ 60 सेकंड के भीतर होखे के चाहीं।
  • हर घटना एक बार काम करती है, a GET शामिल बा, तऽ एगो कैप्चर कइल गइल हेडर के दोबारा इस्तेमाल (replay) ना कइल जा सकेला। हर रिक्वेस्ट खातिर एगो नया साइन करीं। एगो जोड़िए nonce एक यादृच्छिक मान के साथ टैग ताकि एक ही सेकंड में हस्ताक्षरित दो अनुरोध अभी भी भिन्न हों।
  • एगो साइन कइल गइल रिक्वेस्ट के बॉडी जादा से जादा 64 KB के हो सकेला, अउर एगो बॉडी के जरूरत बा Content-Type: application/json.

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

ब्राउजर ई एंडपॉइंट्स के खाली Nymbot के आपन साइट से ही कॉल क सकेला (https://nymbot.ai, https://nymchat.app अउर उनकर सबडोमेन)। कवनो दूसरा साइट के पेज के कवनो CORS हेडर वापस ना मिलेला, एहसे ऊ जे वापस कर सकेला ओकरा के पढ़ ना सकेला। स्क्रिप्ट अउर नेटिव ऐप्स, जे कवनो ना Origin, प्रभावित नइखे।

रउआ के गुप्त चाभी

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

ई हेल्पर लोग हेडर बनावेला। एह पेज पर बाद वाला उदाहरण उनकर इस्तेमाल करेला। ऊ हेक्स में सीक्रेट की (secret key) के पढ़ले बाड़े NOSTR_SECRET_HEX; cURL वाला ओकर प्रयोग करेला शुभ मुहूर्त कमांड-लाइन टूल, जो एन. एस. ई. सी. या हेक्स की लेता है, और sha256sum (macOS पर, 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 — के एगो ... चाही हस्ताक्षरित अनुरोध.

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{
  "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());

चाभी के प्रबंधन

ऐप के की लिस्ट के पीछे वाला एंडपॉइंट्स। उन सब के एगो चाही हस्ताक्षरित अनुरोध. हर एगो की (key) एही रूप में वापस मिलल जाला, जेह में समय ISO 8601 में आ राशि sats में बा:

की ऑब्जेक्ट

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

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{ "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 rr-हस्ताक्षरित। वापसी 201.

खेतप्रकारजरूरी बाविवरण
nameडोरीहॅंं1 से 40 अक्षर, राउर दूसर सक्रिय कीज़ से अलग (केस के परवाह कइले बिना)।
limit_satsपूर्णांकना.sats में खर्च के सीमा, कम से कम 1। कवनो सीमा नइखे त, एकरा के छोड़ दीं।
reset_periodडोरीना.daily, weekly ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. monthlyज़रूरतमंद। limit_satsएके अइसन कैप खातिर छोड़ दऽ जवन कबहूँ रिसेट ना होला।
expire_atएस. ए. आर. स्ट्रिंग या पूर्णांकना.जब चाबी काम कइल बंद कर देवेली: एगो ISO 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); एगो कैप जवन कम से कम 1 के पूरा संख्या नइखे; बिना कैप के एगो रीसेट अवधि; गुजरा भइल एक्सपायरी; एगो अनजाना फ़ील्ड (unknown_parameter); चाहे पहिले से 25 सक्रिय चाभी बा (too_many_keys).
429a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a.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 आर. ए. आर. फील्ड साफ़ करेः कोई कैप नहीं, कोई रीसेट नहीं, कोई एक्सपायरी नहीं। रीसेट अवधि को बदलने से शून्य पर एक नया पीरियड शुरू होता है। एक रद्द की को बदला नहीं जा सकता (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 रद्द कइल गइल की (keys) के राखल जाला; जब कवनो अउरी की रद्द कइल जाला, त पुरान वाला के हटा दिहल जाला।

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{ "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());

NWC ऑटो-टॉप-अप

Nostr Wallet Connect के साथ एगो Lightning wallet के जोड़ दऽ अउर जब API के खर्चा कम हो जाई त Nymbot अपने आप balance बढ़ा दी। ऐप के API शीट में ओही सेटिंग बाड़े; ई ओकरे पीछे के endpoints हउवन। उनकर सब के एगो ज़रूरत बा हस्ताक्षरित अनुरोध.

ई कइसे काम करेला: जब कवनो API रिक्वेस्ट राउर चुनल गइल बैलेंस से कट जाला, आ अगर ऊ बैलेंस राउर तय कइल सीमा से कम हो जाला, त Nymbot राउर टॉप-अप राशि खातिर एगो इनवॉइस बनावेला, राउर वॉलेट से ओकर भुगतान करे के कहेला, आ क्रेडिट जोड़ देवेला। ई हर nym आ बैलेंस खातिर ज़्यादा से ज़्यादा हर 5 मिनट में एक बार टॉप-अप करेला, ताकि ढेर सारा रिक्वेस्ट एक साथ आ के वॉलेट खाली ना कर सके। ऐप्स में खर्च करे से ई चालू ना होला। पिछला टॉप-अप के समय आ मात्रा, तउ आखिरी गलती, सेटिंग्स में बा; अगर कवनो गलती के बाद भुगतान सफल भइल होखे, त ओकर इनवॉइस चेक करऽ टॉप-अप के स्थिति एकर श्रेय देवे के चाहीं।

वॉलेट कनेक्ट करे के पहिले

एगो कनेक्शन स्ट्रिंग जवन के लगे होला, ओकरा के राउर वॉलेट से पइसा मांगे के अनुमति दे देला। Nymbot एके एन्क्रिप्ट करके रखले बा आ खाली अपना टॉप-अप इनवॉइस के भुगतान करे खातिर ही इस्तेमाल करेला, बाकिर खाली एही काम खातिर एगो कनेक्शन बनावल जा सकेला, जवना में राउर वॉलेट में एगो खर्च के बजट सेट कइल जा सकेला, ताकि उ खाली उहे रकम भर सके जवन रउआ तय कइले बानी। वॉलेट में एहिकर सपोर्ट होखे के चाहीं pay_invoice.

ए. आर. ए. बटुआ जोड़ना

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — दस्तखत कइल गइल।

खेतप्रकारजरूरी बाविवरण
nwc_urlडोरीहॅंंकनेक्शन स्ट्रिंग, शुरू होत बा nostr+walletconnect://. Nymbot वॉलेट से मांगता हवे get_info सेव् करने से पहले, इसे एन्क्रिप्टेड तरीके से स्टोर करें।
threshold_satsपूर्णांकहॅंंजब बैलेंस एतना कम हो जाई तऽ टॉप अप कऽ लीं। कम से कम 1,000।
topup_satsपूर्णांकहॅंं1,000,000 sats में 1,000 प्रत्येक बार जोड़ने के लिए।
tierडोरीना.pro (जे डिफ़ॉल्ट बा) चाहे standard: देखल आ टॉप-अप करे के बैलेंस।

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{
  "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_rejectedr); कनेक्शन चालान का भुगतान नहीं कर सकता (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 — दस्तखत कइल गइल।

rs उसी वस्तु को वापस करता है जिसे जोड़ने के रूप में, के साथ 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 — दस्तखत कइल गइल।

जमा कइल गइल कनेक्शन स्ट्रिंग के मिटा देला। अब कवनो टॉप-अप ना होई। पक्का करे खातिर, रउआ आपन वॉलेट में कनेक्शन के रद्द (revoke) भी कर सकेनी।

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

{ "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चैट, जवाब आ मैसेज के हमेशा एगो की (key) के जरूरत होला। जवन रिक्वेस्ट में की (key) होला, ओकर बिल हमेशा के तरह बैलेंस से कटल जाला; पेमेंट के प्रक्रिया तब शुरू होला जब कौनों की (key) ना भेजल जाला।

निम्बॉट एक ही विचार के दो संस्करण बोलते हैं, एक बैकएंड सेः लाइटनिंग लैब्स ' L402 (एकर पुरान नाम से भी स्वीकारल जाला, LSAT) अउर IETF ड्राफ्ट भुनाई HTTP प्रमाणीकरण योजना lightning रैटरि मेथड एंड charge रिफर इरादे. जिसे आपका ग्राहक समझे उसे ही उपयोग करें।

अपना सर्वर चलावल

बिना चाबी दे भुगतान तभी चालू रहता है जब API_L402_SECRET कम से कम 32 रैंडम बाइट के राखत बा, हेक्स (64 अक्षर) भा base64 (44) के रूप में। एगो बनावा ________ के साथ openssl rand -hex 32एस. आर..................................................................................................................................................................................................... API_L402_SECRET_PREVIOUS एक दिन खातिर: क्रेडेंशियल, स्टेटस URL आ ओकरा तहत बनल चुनौती तब ले काम करत रहिहें जबले ऊ एक्सपायर ना हो जाईं।

चुनौती

ना कहे अनुरोध भेजो Authorization header. अगर ई सही बा, त कुछुओ ना चली, अउर तहुँ के मिली 402 Payment Required उहे दाम जवन एगो की (key) देवे के पड़ी, 10 sats एगो स्टैंडर्ड क्रेडिट भा 100 sats एगो प्रो क्रेडिट के हिसाब से बदल के अउर एगो पूरा सैट (sat) तक राउँड अप कइल जाव (कम से कम 1 sat, अउर कम से कम 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 पैरामीटर base64url JSON बा: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. आर. ए. Content-Type (एकर मीडिया टाइप आ, multipart खातिर, एकर बाउंड्री) आ राउर भेजल गइल सटीक बॉडी बाइट्स के SHA-256 के, आ ई 15 मिनट ले चलत बा। पइसा देवे के बाद, भेज दीं एकै जइसन फेर से विनती करीं: उहे Content-Type समान जे. एस. ओ. एन. बाइट्स, या बहुपक्षीय समापन बिंदुओं के लिए (/images/edits, /audio/transcriptions, /audio/translations) ओही multipart body के ओही boundary के साथ। अधिकतर HTTP libraries हर बार फॉर्म encode करत घरी एगो नया boundary चुन लेले स, एहसे एक बार encode कर दऽ आ उ bytes के दू बार भेज दऽ।

हर एक पता एगो मिनट में 30 चुनौती मांग सकेला (IPv6 पता के ओकर पूरा /64 मानल जाला)। जवन रिक्वेस्ट के पता ना जानल जाला, ओकरा खातिर एगो मिनट में 10 चुनौती के कड़ा नियम बा, अउर सभे पता के मिला के Nymbot जवन चुनौती देला ओकरा पर एगो कुल सीमा लागल बा; कवनो अइसन रिक्वेस्ट जेके चुनौती देवे से पहिले ही मना क दिहल जाई (जइसे कि अगर JSON सही ना होखे), उ एह सीमा में ना गिनेला। ओकरा बाद जवाब बा 429 संगे Retry-After, बॉडी पढ़ल जाए से पहिले भेजल जाला। बिना कवनो की (key) चाहे क्रेडेंशियल के कॉल कइल गइल एंडपॉइंट्स भी प्रति एड्रेस एक मिनट में 120 अनऑथेंटिकेटेड रिक्वेस्ट के सामान्य सीमा में गिना जाला। बॉडी पढ़ल जाए से पहिले क्रेडेंशियल के चेक कइल जाला, अउर अइसन रिक्वेस्ट जेकर Content-Type नईखे application/json (अथवा multipart/form-data अपलोड खातिर) के अस्वीकार कइल जा रहल बा 415 अउर कखनो ना पावेला कवनो इनवॉइस।

एम्बेडिंग्स के कीमत इनपुट में टोकन के अनुमान से तय कइल जाला, 1.5× मार्जिन के साथ, काहे कि असली गिनती बाद में ही पता चल पावेला। रउआ ओही टोकन के पैसा देवेनी जेकर असल में इस्तेमाल भइल बा, अउर पइसा के बचल हिस्सा वापस मिल जाला एगो रिफंड टोकन.

पइसा भेजत बानी

कवनो भी Lightning wallet से बिल (invoice) भर दीं। वॉलेट राउर के preimage दी, जे 64 hex character के होला। ओकरा बाद ई दुनो में से कवनो एगो के साथे उहे रिक्वेस्ट भेज दीं:

योजनाहेडरName
L402Authorization: L402 <macaroon>:<preimage> (LSAT rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
भुनाईAuthorization: Payment <base64url JSON>, जहाँ JSON बा {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

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

स्थितिमाब्ला?
402 payment_already_usedहर एगो पेमेंट एगो रिक्वेस्ट खातिर होला। रिस्पॉन्स एह रिक्वेस्ट खातिर एगो नया चुनौती ह, एहसे एगो क्लाइंट जवन अपना आखिरी क्रेडेंशियल के कैश कर लेला (जइसे lnget r = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
402 payment_mismatchशंसापत्र अन्य अंतिम बिंदु के लिए जारी किया गया था, Content-Type अउर शरीर, चाहे ई विनती से कम भुगतान अब लागत बा। एह विनती खातिर एक नया चुनौती साथे आवेला; अगर भुगतान बहुत कम रहे, त राउर भुगतान वापस आ जाई एगो रिफंड टोकन (refund_token औरी refund_sats शरीर में)।
402 payment_expiredचुनौती के बाद 15 मिनट से बेसी बीत गइल बा। एगो नया चुनौती एकरा साथे आवेले। अगर प्रीइमेज ई देखावेला कि रउआ भुगतान कइले बानी, त रउआ जवन भुगतान कइले बानी ऊ एगो के रूप में वापस आ जाई रिफंड टोकन (refund_token औरी refund_sats देह में), एक बार; फिर साख का उपयोग किया जाता है।
401 invalid_preimagePreimage, invoice के पेमेंट हैश के साथ हैश ना करेला। पेमेंट अभी खतम ना भइल बा।
401 invalid_payment_credentialशंसापत्र विकृत है, निम्बॉट द्वारा जारी किए जाने के बाद इसे बदल दिया गया था, या ऐसे भुगतान हैश का नाम दिया गया था जिसके लिए निम्बॉट ने कभी कोई चालान जारी नहीं किया था। निम्बॉट को एक चेतावनी के साथ एक मैकरून पता नहीं है, या परस्पर विरोधी चेतावनी के साथ, अस्वीकार कर दिया जाता है।
429 rate_limit_exceededएक मिनट में एही एड्रेस से 30 से बेसी क्रेडेंशियल चाहे कुंजी जेके सत्यापन में फेल भइल बा, चाहे एकगो रिफंड टोकन एक मिनट में 60 से बेसी बेर भेजल गइल बा। इंतज़ार करीं 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 बिना कवनो चाबी के काम करे खातिर। ई हस्ताक्षर कइल गइल बा अउर २४ घंटा तक काम करी, जब ले काम चालू बा।

{
  "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"); अगर रेंडर बिना बिल के फेल हो जाला, त पेमेंट ओही पर आ जाई। स्टेटस URL ई देखावत बा refund_sats एगो रिफंड भइल जॉब खातिर बाकिर टोकन कखनो ना मिलल, एहसे स्टेटस URL साझा कइला से रिफंड के जानकारी ना मिली। टोकन के चेक कइल उ फेल भइल जॉब के भी सेटल कर देला जेकरा के केहू पोल ना कइल रहे।

रिफंड्स

यदि कोई भुगतान अनुरोध विफल हो जाता है और प्रदाता प्रयास के लिए निम्बॉट को बिल देता है, तो भुगतान रखा जाता है और त्रुटि ऐसा कहती है, 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 आउर पूरा पइसा वापस आ जाला। एम्बेडिंग्स ऊ वापस कर देला जवन अनुमान रोकले रहे। एगो फेल वीडियो ओही टोकन के रिफंड कर देला जेकर सबमिशन ऊ वापस कइल रहे।

रिफंड टोकन एक यादृच्छिक 256-बिट कोड है। निम्बॉट केवल अपने हैश को संग्रहीत करता है, और यह 30 दिनों के बाद समाप्त हो जाता है। यह एक सैट शेष राशि रखता है, और आप कर सकते हैंः

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

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"

rRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

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