सामग्रीं प्रति गच्छन्तु
निम्बोट् प्रति निवर्त्यताम्।

ज्ञानाधारः विकासकाः।

सन्तुलनं, शीर्ष-अपस् तथा च कीस्

भवतः समीपे किम् अस्ति इति पश्यतु, लैट्निङ्ग् उपरि टाप्-अप् करोतु, स्वस्य व्यालेट् इत्यतः स्वयमेव टाप्-अप् करोतु, प्रत्येकस्य अनुरोधस्य मूल्यं पश्यतु, कोड् इत्यतः की इत्येतान् व्यवस्थापयतु च।

शेषस्य परीक्षणं कुर्वन् अस्ति।

भवतः सन्तुलनं, तथा च अस्य की-क्याप् इत्यस्य कियत् भागं उपयुज्यते।

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 बृहत्तरेषु टाप्-अप्-विशेषेषु अतिरिक्तं क्रेडिट् सूचिबद्धं करोतु, यथा आप्-मध्ये अस्ति-10 प्रतिशतं, 15 प्रतिशतं अथवा 20 प्रतिशतं अधिकं 500,1,000 अथवा 5,000 स्याट्-विशेषेषु टाप्-अप्-विशेषेषु, 5000,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);

विद्युद्वारणस्य उपरि ऊर्ध्वगमनम्।

एकं लाइटनिंग-बीलम् (Lightning invoice) निर्मातुं यत् यस्य कुञ्जिका (key) अस्ति तस्य न्यम् (nym) कृते ऋणम् (credit) योजयति। कृपया तस्मात् कस्यापि लाइटनिंग-पात्रतः (Lightning wallet) तं दास्यतु, ततः पश्यतु। ऋणाधिकाराधिकृत्यं प्राप्तुम्।

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), १०,००,००० सटशिनात् उपरि (amount_too_large) अथवा Lightning wallet द्वारा अस्वीकृतम् (amount_out_of_range).
429अस्य नाम्नः ६० तः अधिकानि बीजकाणि, अथवा अस्मात् स्थानात् १२० बीजकाणि, प्रतिघण्टाम् (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; उच्चतरं पृष्ठम् अस्ति 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);

लेखाप्रार्थनानां हस्ताक्षरं कुर्वन् अस्ति।

की-इत्येतान् निर्मातुं, परिवर्तयितुं, निरस्तुं च, अकौण्ट्-सारांशं, स्वयंचालित-टाप्-अप् इत्येतानि च ए. पी. ऐ. की न स्वीकरोति। ते भवतः एन्. ऐ. एम्. इत्यतः हस्ताक्षरं ग्रहीष्यन्ति, अतः स्रावित-की स्वस्य क्यापपर्यन्तं व्ययं कर्तुं शक्नोति, परन्तु कदापि अन्यत् की निर्मातुं न शक्नोति अथवा स्वकीयं कैपम् उत्थापयितुं न शक्नोति।

आप् एतत् भवतः कृते करोति-तस्य सर्वम्। ए. पि. ऐ. पत्रके एतानि अन्तिमबिन्दुः उपयुज्यन्ते। भवते केवलं स्वकोड्-द्वारा की-प्रबन्धनार्थं एव अस्य खण्डस्य आवश्यकता वर्तते।

सिग्नेचर् इतीदं 27235 (एन्. ऐ. पि.-98) प्रकारस्य नोस्टर् इवन्ट् अस्ति, यत् बेस्64-एन्कोड् मध्ये प्रेषितम् अस्ति। 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 हेक्स्-भाषायां रा-रिक्वेस्ट्-बाडी इत्यस्य एस्. एच्. ए.-256 अस्ति वा इति। POST तथा PATCHतथा च भवान् यत् शरीरं प्रेषयति तत् बैट् इत्यस्य कृते बैट् भवेत् यत् भवान् ह्याश् अकरोत्।
  • created_at सर्वर् इत्यस्य घटिकारात् 60 क्षणेषु एव भवेत्।
  • प्रत्येकं घटना एकवारमेव कार्यं करोति, अ GET समाविष्टा, अतः गृहीतं शीर्षकं पुनः प्रवर्तयितुं न शक्यते। प्रत्येकस्य अनुरोधस्य कृते नूतनं हस्ताक्षरं करोतु। एकं योजयतु। nonce यादृच्छिकमूल्येन सह ट्याग् कुर्वन्तु, अतः एकस्मिन् एव क्षणे हस्ताक्षरितौ द्वौ अनुरोधौ अद्यापि भिन्नाः भवन्ति।
  • हस्ताक्षरित-अनुरोधस्य देहः्यधिकतमं ६४ KB भवितुं शक्नोति, तथा च देहाय आवश्यकता अस्ति Content-Type: application/json.

अनुपस्थितः कार्यक्रमः पुनः आगच्छति। 401 missing_nostr_authएकः यः दुष्टरूपेण निर्मितः, दुष्टतया हस्ताक्षरितः, अतीव पुरातनः, अथवा भिन्नस्य यू. आर्. एल्. इत्यस्य कृते, पद्धत्या वा शरीरस्य कृते वा प्रत्यर्पितः भवति। invalid_nostr_auth, सन्देशस्य कारणेन सह; पुनः प्रयुक्तः प्रत्यावर्तते। nostr_auth_replayedएतेषां अन्तिमबिन्दुषु प्रेषितं ए. पि. ऐ. की अस्वीकृतं भवति। मुख्यभागस्य पठनात् पूर्वं हस्ताक्षरं परीक्षितं भवति, तथा च प्रत्येकं सङ्केतः प्रतिनिमेषे 30 प्रावश्यं विफलाः भवितुम् अर्हति (एकः ऐ. पि. वि. 6 सङ्केतः तस्य सम्पूर्णः/64 इति गण्यते); ततः परं सः प्राप्तः भवति। 429 तेन सह। Retry-After.

ब्रौसर्-विशेषाः एतानि अन्तिमबिन्दुः केवलं निम्बोट्-संस्थायाः स्वस्थलात् एव आह्वयितुं शक्नुवन्ति (https://nymbot.ai, https://nymchat.app तस्य उपडोमेनमध्ये अपि। अन्यस्य कस्यापि сайटनः पृष्ठं कोऽपि CORS शीर्षकानि (headers) न प्राप्नोति, अतः तत् तेषाम् उत्तरं पठितुं न शक्नोति। स्क्रिप्टाः नूतनाः च एप्लिकेषाः, ये न प्रेषयन्ति Origin, न प्रभाविताः सन्ति।

भवतः गुप्तः चाबिः।

हस्ताक्षराणि भवतः नामनस्य गुप्तकुञ्जिकां (the) आवश्यकं कुर्वन्ति 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एतस्मिन् घण्टे अस्मिन् नाम्ना ६० मदभ्यः अधिकाः कुञ्जीः अथवा एतस्मात् पतेः १२० कुञ्जीः (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यत् कुंजी पूर्वमेव निरस्तं कृते तस्य पुनः निरसनं अपि तादृशीं प्रतिक्रियां ददाति। केवलं नूतनाः पञ्चाशत् निरस्ताः कुञ्जीः एव रक्षिताः भवन्ति; अन्यः निरसनः सति पुराणतुल्याः कुञ्जीः विलोप्यन्ते।

प्रत्युत्तरं ददातु।

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

एन. डब्ल्यू. सी. स्वतः-शीर्ष-अप

Nostr Wallet Connect सहैः Lightning wallet संयोजयत, यदा API-व्ययः अल्पं भवति तदा Nymbot स्वयमेव धनराशिं पूरयति। App इत्यस्य API-पञ्जिकायां अपि एते एव निर्देशः सन्ति; एते तस्य पृष्ठे अन्तबिन्दवः (endpoints) सन्ति। एतेषु सर्वेषां आवश्यकता अस्ति हस्ताक्षरितं निवेदनम्।.

एतत् कथं कार्यं करोति-यदा ए. पि. ऐ. निवेदनं भवान् इच्छति तदनुगुणं शुल्कं स्वीकृत्य, यदि भवतः शेषराशिः भवतः सीमातः अधः पतति तर्हि निम्बोट् भवतः टाप्-अप्-परिमाणस्य कृते इन्वाय्स् करोति, भवतः व्यालेट् इत्येनं दातुं वदति, क्रेडिट् योजयति च। एतत् प्रत्येकस्य निम् इत्यस्य शेषस्य च कृते अधिकतमं प्रति 5 निमेषेषु एकवारं उपरि भवति, अतः अनुरोधानां विस्फोटनेन व्यालेट् निष्कासितुं न शक्यते। एप्स्-मध्ये व्ययः तत् न प्रेरयति। अन्तिमस्य टाप्-अप् इत्यस्य समयः, आकारः, तथा अन्तिमस्य त्रुटिः च सेट्टिङ्ग्स् मध्ये भवन्ति; यदि देयस्य कृते त्रुटिः अभवत् तर्हि तस्य इन्वाय्स् इतीदं पश्यतु। उपरि स्थितिः तस्य श्रेयः दीयतः।

व्यालेट् योजयितुं प्राक्

एकः संयोजन-सूत्रः (connection string) यस्य समीपे अस्ति सः तव वित्तपात्रं (wallet) प्रयोक्तुं शक्नोति। Nymbot ततुल्यं कूटबद्धं (encrypted) स्थापयति तथा च केवलं स्वस्य पुनर्भरण-बीलकानि (top-up invoices) दातुं तस्य प्रयोगं करोति, किन्तु एतस्य कृते एव एकं विशिष्टं संयोजनं कुरु, यत्र तव वित्तपात्रे व्यय-सीमा (spending budget) स्यात्, येन सः उच्चतमं कियत् धनं दातुं शक्नोति इति त्वया निर्धारितं संख्यायाः अधिकं न भवेत्। वित्तपात्रस्य एतस्य समर्थनं करणीयम्। pay_invoice.

व्यालेट् संयोजयति।

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect हस्ताक्षरं कृतवान्।

क्षेत्रम्।प्रकारःआवश्यकम्वर्णनम्
nwc_urlस्त्रिङ्ग्आम्‌सम्बन्धपदमालिका, आरभते nostr+walletconnect://. Nymbot: wallet/pātrāt prati pracchati 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). अन्यौ द्वयोः अन्तबিন্দুयोः अपि एतदेव लागू भवति।

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 यदा किमपि वॉलेट (wallet) न संयोजितम्। संयोजन-सूत्रं (connection string) स्वयं कदापि न प्रीयते।

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

कुञ्जीं विना प्रतिअनुरोधं शुल्कं ददाति

नियतमूल्य-अन्त्यबिन्दवः (fixed-price endpoints) Lightning माध्यमेन प्रतिप्रश्नानुसारं एकैकं भुक्तुं शक्यन्ते, किमपि कुञ्चिका (key), किमपि खातं (account) वा किमपि शेषधनं (balance) विना: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations तथा POST /embeddings. वार्तालापस्य, प्रतिक्रियायाः, सन्देशस्य च सर्वदा की आवश्यकं भवति। की-युक्तः अनुरोधः यथाक्रमं शेषं प्रति बिल् भवति, देयस्य प्रवाहः तदा एव आरभते यदा की न प्रेषिता भवति।

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

स्वस्य सर्वर् इत्यस्य सञ्चालनं कुर्वन् अस्ति।

कुञ्जीं विना भुगतानं कदा एव भवति API_L402_SECRET किञ्चित् ३२ अनियताः बाइटPostConstruct (bytes), षोडशके (६४ चरित्राणि) अथवा base64 (४४) रूपेण धारयति। एकं निर्माणयतु। openssl rand -hex 32लघुः अथवा अनुमानगम्यः मानः वैशिष्ट्यं निरुध्य कारणं च लिखति। तस्य परिवर्तनाय, पुरातनं मानं गच्छतु API_L402_SECRET_PREVIOUS एकस्य दिवसस्य कृतेः क्रेडेन्शियल्स्, स्टेटस्-यू. आर्. एल्. तथा तस्य अन्तर्गतं कृतप्रतिसन्धयः च समाप्तिपर्यन्तं कार्यं कुर्वन्ति।

च्यालेञ्ज़् इति।

विना प्रार्थनां प्रेषय। 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 (तस्य माध्यमितिः, बहुभागीयं चेत् तस्य सीमापदानं च) तथा च भवता प्रेषितस्य शरीरस्य यथार्थByte-सङ्ख्यानां SHA-256 इति च, यत् १५ मिनिटाणि यावत् तिष्ठति। प्रदानात् अनन्तरं प्रेषयतु समानम्। पुनर्मन्यते: तत् एव Content-Type तथा समानानि जे. एस्. ओ. एन्. बैट्स्, अथवा बहुभाग-अन्तिमबिन्दुभ्यः (/images/edits, /audio/transcriptions, /audio/translations) समानसीमायुक्तः एव बहुभागीयभागः। अधिकांशाः एच. टी. टी. पी. ग्रन्थालयाः प्रतिसमयः प्रपत्रस्य सङ्केतनं कुर्वन्तः नूतनसीमां चिन्वन्ति, अतः एकवारं सङ्केतनं कृत्वा द्विगुणं बैट् इत्येतान् प्रेषयन्ति।

प्रत्येकं अनुमतिः प्रतिमिनिटं ३० आव्हानानि प्रार्थयितुं शक्नोति (एकः IPv6 पता स्वस्य पूर्णं /64 इति गण्यते)। यैः पता अज्ञाताः सन्ति, तेषां प्रतिमिनिटं १० आव्हानानां कश्चन कठोरः नियमः अस्ति, तथा च सर्वेषु पतासु Nymbot यत् आव्हानानि ददाति तत्र एकं समग्रं सीमायाः निर्धारणं वर्तते; चुनौतीर्विना प्रेषितं निवेदनं (यथा, यत् अमानकं JSON इति) तत्र न गण्यते। ततः उत्तरं अस्ति 429 तेन सह। Retry-After, यत् विषयवस्तुं पठितुं पूर्वमेव प्रेषितम्। कठिनाङ्क-रहिताः (unauthenticated) अन्तबिन्दवः (endpoints) यत् कुञ्जीनां वा प्रमाणपत्राणां वा विना आह्विताः, ते अपि प्रति-विपुलस्थानं प्रति प्रतिमिनिटं १२0 (120) प्रस्थानानां सामान्यसीमायाः अन्तर्गतं गणिताः भवन्ति। विषयवस्तुं पठितुं पूर्वमेव प्रमाणपत्रं परीक्ष्यते, तथा च यत् प्रस्थानं यस्य Content-Type नस्ति application/json (अथवा multipart/form-data अपलोडस् कृते) इत्यनेन सह अस्वीकृतः अस्ति। 415 तथा कदापि मुद्रापत्रं न प्राप्स्यति।

अन्तर्निर्मितानां मूल्यनिर्धारणं निवेशितानां टोकन्-विशेषाणां अनुमानात्, 1.5&times मार्जिन्-सहितं भवति, यतः वास्तविक-गणना पश्चात् एव ज्ञातुं शक्यते। भवान् वस्तुतः प्रयुक्तानां टोकन्-विशेषाणां कृते शोधनं करोति, तथा च देयस्य अप्रयुक्तः भागः प्रतिदानरूपेण पुनः आगच्छति। धनप्रत्याገባ-चिह्नम्.

शोधनं प्रेषयतः।

कस्यापि लैट्निङ्ग्-व्यालेट्-द्वारा इन्वाय्स् इत्यस्य शोधनं करोतु। व्यालेट् भवते 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 शीर्षकम् (base64url-रूपेण JSON, चुनौती-परिचयेन सह, भुगतान-हॅशः यथा reference, status तथा timestamp). सशुल्क-अनुरोधाः किमपि नामना सह न सम्बद्धाः सन्ति, अतः ते अन्वेषण-इतिहासे न दृश्यन्ते।

स्थितिः।कदा
402 payment_already_usedप्रत्येकं शोधनं एकस्य अनुरोधस्य कृते देयम् अस्ति। प्रतिक्रिया अस्य अनुरोधस्य कृते नूतनप्रतिसन्धिः अस्ति, अतः यः ग्राहकः स्वस्य अन्तिमप्रमाणपत्रं क्याश् करोति (यथा lnget करोति) केवलं पुनः शोधयति।
402 payment_mismatchअन्यस्य अन्तिमस्थानस्य कृते प्रमाणपत्रं प्रादीयत। Content-Type अथ वा शरीरम्, अथ वा एतस्मात् अनुरोधात् न्यूनं शुल्कं ददति, अधुना व्ययः भवति। एतस्याः अनुरोधस्य कृते नूतनप्रतिसन्धिः तेन सह आगच्छति; यदि शोधनं अत्यल्पम् आसीत्, तर्हि भवान् यत् दत्तवान् तत् प्रतिदानरूपेण प्रत्यावर्तते। धनप्रत्याገባ-चिह्नम् (refund_token तथा refund_sats शरीरेऽस्मिन्)।
402 payment_expiredचुनौतीतः १५ минуणां अधिकं समयः व्यतीतः। नूतना चुनौती सह आगच्छति। यदि पूर्वप्रतिमा दर्शयति यत् त्वया दत्तम्, तर्हि यत् त्वया दत्तम् तत् पुनरपि आगच्छति। धनप्रत्याገባ-चिह्नम् (refund_token तथा refund_sats शरीरे), एकवारं; ततः प्रमाणस्य उपयोगः भवति।
401 invalid_preimageपूर्वचित्रं इन्वाय्स् इत्यस्य देयस्य ह्याश् इत्यस्य कृते ह्याश् न करोति। देयस्य व्ययः न भवति।
401 invalid_payment_credentialप्रमाणपत्रं विकृतं वर्तते, अथवा निम्बोत् (Nymbot) तस्य निर्गमनात् अनन्तरं परिवर्तितम्, अथवा एतद् तस्य भुगतान-हशस्य (payment hash) उल्लेखं करोति यस्य कृते निम्बोत् कदापि बीजकं (invoice) न निर्गतवान्। निम्बोत् अनजानात् प्रतिबन्धसहितं (caveat) वा विरोधाभासपूर्णप्रतिबन्धसहितं मकारूनं (macaroon) अस्वीकृतं भवति।
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 तत् कार्यस्य अनुसरणार्थं किमपि चाबि विना भवति। हस्ताक्षरितं भवति तथा च 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"); यदि रेण्डर् अन्बिल् असफलः भवति तर्हि देयराशिः तत्र पतति। स्थितिः यू. आर्. एल्. दर्शयति। refund_sats प्रतिदायितस्य कार्यस्य कृते किन्तु कदापि टोकन् इति नास्ति, अतः स्थित्याः यू. आर्. एल्. इत्येतस्य आदानप्रदानं प्रतिदानं न करोति। टोकन् इत्यस्य परीक्षणं असफलस्य कार्यस्य निर्णयम् अपि करोति यत् न केनापि मतदानं कृतम्।

प्रतिदायः।

यदि शोधितः अनुरोधः असफलः भवति तथा च प्रदायकः प्रयत्नस्य कृते निम्बोट् इत्यस्य बिल् करोति, तर्हि शोधनं रक्षितं भवति तथा च त्रुटिः एवं कथयति। 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 } }