सामग्री पर जाओ
निम्बॉट पर बापस जाओ

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

संतुलन, टॉप-अप ते कुंजी

जांचो जे तुंʼदे कोल केह् ऐ, लाइटनिंग पर टॉप अप करो, अपने बटुए चा अपने आप टॉप अप करो, दस्सो जे हर इक विनती दी लागत केह् ऐ, ते कोड थमां चाबियें दा प्रबंधन करो।

संतुलन दी परख करना

तुंʼदे दोऐ शेष, ते इस चाबी दी कैप दा किन्ना इस्तेमाल कीता जंदा ऐ।

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

पुछगिछ दा इतिहास

प्रति विनती इक कतारः एह् केह् हा, केह्ड़ा माडल, किन्ने टोकन ते इंʼदी कीमत केह् ऐ। कोई संकेत जां जवाब नेईं रक्खेआ जंदा ऐ, इस करियै कोई बी बापस नेईं दित्ता जंदा ऐ। कतारें गी 90एं दिनें आस्तै रक्खेआ जंदा ऐ, सभनें शा नमियां पैह्लें। इक चाबी जेह्ड़ी अपने कैप तक्कर पुज्जे दी ऐ ओह् अजें बी अपना इतिहास पढ़ सकदी ऐ।

GET https://nymbot.ai/api/v1/queries/history - इक ए. पी. आई. कुंजी दी लोड़ होंदी ऐ, जेह्ड़ी अपने अनुरोधें गी देखती ऐ, जां दस्तखत कीते गेदे अनुरोध तुंʼदे एन. आई. एम. थमां, जेह्ड़ा हर इक चाबी गी देखता ऐ।

खेतराकिसमाजरूरीविवरण
pageपूर्णांक (क्वैरी)नेईं।डिफ़ॉल्ट 1, सकल 1,000; इक वaddi पेज ऐ 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 एह् एच. टी. टी. पी. तरीका ऐ।
  • payload की raw request body दा SHA-256, hex च है। ए उंदी ज़रूरी है ऑन POST ते PATCHते तुंʼदे आसेआ भेजी जाने आह्ली किश्त गी तुंʼदे आसेआ हैश कीते गेदे किश्त दे बदले च किश्त होना चाहिदा।
  • created_at सर्वर दी घड़ी दे 60 सैकेंड्स दे अंदर होना चाहिदा।
  • हर इक घटना इक बारी कम्म करदी ऐ, ए GET शामिल ऐ, तां कोई कैप्चर कीता होया हेडर रीप्ले नहीं कीता जा सकदा। हर रिक्वेस्ट दी इक नई साइन करो। इक जोड़ो nonce इक बेतरतीब मूल्य दे कन्नै टैग करो तां जे इक गै सैकेंड च दस्तखत कीते गेदे दो अनुरोध हून बी बक्ख होन।
  • दस्तखत कीते गेदे अनुरोध दा मूल हिस्सा बद्धोबद्ध 64 के. बी. होई सकदा ऐ, ते इक निकाय गी उंʼदी लोड़ होंदी ऐ। Content-Type: application/json.

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

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

तुंदी गुप्त चाबी

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

एह् मददगार हेडर दा निर्माण करदे न। इस पेज पर बाद दे मसालें च उंʼदा उपयोग कीता जंदा ऐ। ओह् हेक्स च गुप्त कुंजी गी हेक्स च पढ़दे न। NOSTR_SECRET_HEXसी. यू. आर. एल. इक दा उपयोग करदा ऐ ऐन्न. ए. के. कमांड-लाइन टूल, जेह्ड़ा इक एन. एस. सी. जां हेक्स कुंजी लैंदा ऐ, ते 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); इक कैप जेह्ड़ी घट्ट कोला घट्ट 1 दी पूरी गिनतरी नेईं ऐ; इक कैप दे बगैर रीसैट अवधि; अतीत च इक मियाद खत्म होना; इक अनजान खेतर (unknown_parameter); जां 25 सक्रिय कुंजी पैह्लें थमां गै (too_many_keys).
429इस एन. आई. ऐम्म. आसेआ इक घैंटे च 60 कोला मते जां इस पते थमां 120 चाबी बनाई गेइयां (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 एक फील्ड गी साफ करदा ऐ: कोई कैप नी, कोई रीसेट नी, कोई एक्सपायरी नी। रीसेट दी अवधि बदल्न कन्नै शून्य तों इक नई अवधि शुरू हो जांदी ऐ। इक रिवोक की (revoked 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());

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

इक लाइटनिंग बटुए गी नोस्टर वॉलेट कनेक्ट कन्नै जोड़ो ते जिसलै ए. पी. आई. खर्च इसगी घट्ट चलाउंदा ऐ तां निम्बॉट अपने आप च इक संतुलन गी बधांदा ऐ। ऐप दी ए. पी. आई. शीट दी सैट्टिंग बराबर होंदी ऐ; एह् एह्दे परैंत्त दे अंत बिंदु न। इʼनें सभनें गी इक संतुलन दी लोड़ होंदी ऐ जिसलै ए. पी. आई. खर्च इसगी घट्ट चलाउंदा ऐ। दस्तखत कीते गेदे अनुरोध.

एह् किʼयां कम्म करदा ऐः इक ए. पी. आई. विनती दे परैंत्त तुंʼदे आसेआ चुने दे बाकी बकाये पर चार्ज कीता जंदा ऐ, जेकर ओह् बकाया तुंʼदी सीमा शा खʼल्ल आई गेआ ऐ, तां निम्बॉट तुंʼदी टॉप-अप रकम आस्तै इक चालान करदा ऐ, तुंʼदे बटुए गी भुगतान करने आस्तै आखदा ऐ, ते क्रेडिट जोड़दा ऐ। एह् हर इक निंब ते बकाया आस्तै हर 5 मिंटें च इक बारी टाप अप होंदा ऐ, इस करियै अनुरोधें दा इक धमाका बटुए गी खत्म नेईं करी सकदा ऐ। ऐप्स च खर्च करने कन्नै एह् ट्रिगर नेईं होंदा ऐ। खीरले टॉप-अप दा समां ते आकार, ते खीरली गलती, सेटिंग्स च होंदी ऐ; जेकर कोई भुगतान गलती दे परैंत्त होआ, तां एह्दे चालान दी जांच इस चाल्ली करो टॉप-अप स्थिति इसगी श्रेय देओ।

बटुआ जोड़ने शा पैह्लें

इक कनेक्शन स्ट्रिंग जेह्ड़ा कोई बी इसगी अपने कोल रखदा ऐ, उसी तुंʼदे बटुए गी भुगतान करने आस्तै आखदी ऐ। निम्बॉट इसगी कूटबद्ध करदा ऐ ते इसगी छड़ा अपने टॉप-अप चालानें दा भुगतान करने आस्तै इस्तेमाल करदा ऐ, पर सिर्फ एह्दे आस्तै इक कनेक्शन बनाओ, तुंʼदे बटुए च इक खर्च बजट दे कन्नै, तां जे एह् सभनें शा मते भुगतान तुंʼदे आसेआ चुने दा नंबर करी सकै। बटुए गी समर्थन करना होग। pay_invoice.

बटुआ जोड़ना

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect - दस्तखत कीते।

खेतराकिसमाजरूरीविवरण
nwc_urlस्ट्रिंगहांकन्साection स्ट्रिंग, शुरू होनदे nostr+walletconnect://निम्बॉट बटुए दे बारे च पुछदा ऐ get_info इसगी बचाने शा पैह्लें, ते इसगी कूटबद्ध रूप कन्नै भंडारत करो।
threshold_satsपूर्णांकहांजिसलै बाकी रकम इʼनें सारे सैट्स कोला घट्ट होई जंदी ऐ तां टॉप अप करो। घट्ट कोला घट्ट 1,000।
topup_satsपूर्णांकहांहर बारी किन्ना जोड़ना ऐ। 1,000 गी 1,000,000 सैट्स च जोड़ना ऐ।
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). एदेई गल्ल बक्खी द दो एंडपॉइंट्स (endpoints) लेई भी ऐ।

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. चैट, रिस्पॉन्सें ऐं मेसेजें दे कन्नै हमेशा इक की (key) दी लोड़ हुंदी ऐ। इक रिक्वेस्ट जेहड़ी की कन्नै आंदी ऐ, ओदा बिल बैलेंस चो हमेशा दी कन्नै कटदा ऐ; पेमेंट फ्लो उंदी ऐ जिंदे कन्नै कोई की नी भेजी जांदी।

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

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

बगैर चाबी दे भुगतान करना तां गै चालू होंदा ऐ जिसलै API_L402_SECRET कम्ते ते कम्ते 32 रैंडम bytes, hex (64 characters) या base64 (44) दे रूप च। इक इक करदे ओ openssl rand -hex 32इक लौह्का जां अंदाज़ा लाने जोग मान फीचर गी बंद करी दिंदा ऐ ते लाग करदा ऐ जे की। इसगी घुमाने आस्तै, पुराने मान गी अग्गें बधांओ API_L402_SECRET_PREVIOUS इक दिन आस्तैः प्रमाण-पत्र, स्थिति यू. आर. एल. ते एह्दे मताबक बनाई गेदे चैलेंज उसलै तक्कर कम्म करदे होंदे न जिसलै तक्कर जे उंʼदी मियाद खत्म नेईं होई जंदी।

चुनौती

नांS दे कन्नै विनती भेजो 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 (एह्दे मीडिया किसम ते, बहु-भाग आस्तै, एह्दे सीमा) ते तुंʼदे आसेआ भेजे गेदे सटीक शरीर बाइट्स दे SHA-256 पर, ते 15 मिंट तक्कर चलदा ऐ। भुगतान करने दे परैंत्त, भेजो बराबर परतियै विनतीः नेहा गै ऐ Content-Type ते बराबर जे. ऐस्स. ओ. ऐन्न. बाइट्स, जां बहु-भाग अंत बिंदुएं आस्तै (/images/edits, /audio/transcriptions, /audio/translations) इक गै सीमा दे कन्नै इक गै बहु-भाग निकाय। जैदातर एच. टी. टी. पी. पुस्तकालय हर बारी जिसलै ओह् कुसै फार्म गी एनकोड करदे न तां इक नमीं सीमा चुनदे न, इस करियै इसगी इक बारी एनकोड करो ते उ'नें बाइट्स गी दो बारी भेजो।

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

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

भुगतान भेजना

कुसै बी बिजली दे बटुए कन्नै चालान दा भुगतान करो। बटुआ तुसें गी 64 हेक्स वर्णें दी पूर्व-छवि दिंदा ऐ। फ्ही इʼनें बिच्चा इक दे कन्नै नेहा गै अनुरोध भेजोः

योजनाहेडर
L402Authorization: L402 <macaroon>:<preimage> (LSAT बी कम्म करदा ऐ)
भुगतानAuthorization: Payment <base64url JSON>जे. ऐस्स. ओ. ऐन्न. कु'यां ऐ {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

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

स्थितिकɗे
402 payment_already_usedहर भुगतान इक रिक्वेस्ट दा भुगतान करदा ऐ। रिस्पांस इस रिक्वेस्ट ले इक नवा चैलेंज ऐ, तां इक क्लाइंट जेह्ड़ा अपणा पिछला क्रेडेंशियल कैश करदा ऐ (जियां lnget करदा ऐ) बस परतियै भुगतान करदा ऐ।
402 payment_mismatchइक होर आखरी बिंदु आस्तै प्रमाण-पत्र जारी कीता गेआ हा, Content-Type या शरीर, या इस गुल्लक तों कम देंदा ऐ हुण खर्चे। इस गुल्लक लेई इक नवा चल्लौती ऐ; जे भुगतान बहुत छोटा सी, जो तुस अत्त दित्ता ओ वापस आ जांदा ऐ इक रिफंड टोकन (refund_token ते refund_sats शरीर च)।
402 payment_expiredचुनौती देगे 15 मिनटें कन्नै गुज़े गए न। इक नययी चुनौती कन्नै आउंदी ऐ। जे प्री-इमेज च दिखदा ऐ कि तुस भुगतान कर दित्ता ऐ, जो तुस भुगतान कीता ऐ, ओ इक... रिफंड टोकन (refund_token ते refund_sats बॉडी च), इक वार; क्रेडेंशियल दी फेर इस्तेमाल कर लई जांदी ऐ।
401 invalid_preimageप्रीइमेज चालान दे भुगतान हैश गी हैश नेईं करदा ऐ। भुगतान दा इस्तेमाल नेईं कीता जंदा ऐ।
401 invalid_payment_credentialसाख गलत ऐ, निम्बॉट आसेआ जारी कीते जाने दे परैंत्त बदली दित्ती गेई ही, जां इक भुगतान हैश दा नांऽ दित्ता गेआ हा जेह्दे लेई निम्बॉट ने कदें कोई चालान जारी नेईं कीता हा। निम्बॉट गी नेईं पता इक चेतावनी आह्ले मैकरून, जां परस्पर विरोधी चेतावनी दे कन्नै, इन्कार करी दित्ता जंदा ऐ।
429 rate_limit_exceeded30 कोला मते प्रमाण जां चाबियां जेह्ड़े तसदीक करने च नाकाम रेहियां, ओह् इस पते शा इक मिंट च आई गेइयां, जां इक रिफंड टोकन इक मिंट च 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 बिना किसे चाबी दे काम करने लेई। एदे उत्ते दस्तखत हैं ते 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"); जेकर रेंडर अनबिल्ड फेल हो जांदा ऐ, पेमेंट उसदे उत्ते आ जांदी ऐ। स्टेटस 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 वार इस्तेमाल कीता जा सकदा ऐ।
  • इसगी इक एन. आई. एम. पर लेई जाओ। एह्दे च चिपकाओ तोह्फा मोड़ो निम्बॉट ऐप च, जां काल करो 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 } }