आशयाचेर वचचें
निम्बॉटा कडेन परत वच.

गिन्यानाचो आदार विकसक

शिल्लक, टॉप-अप आनी किल्ली

तुमचे कडेन कितें आसा तें तपासात, लाईटनींगाचेर टॉप अप करात, तुमच्या स्वताच्या वॉलेटांतल्यान स्वयंचलितपणान टॉप अप करात, दर एका विनंत्याक कितलो खर्च येता तें पळयात, आनी कोडांतल्यान किल्ली वेवस्थापन करात.

शिल्लक तपासप

तुमचीं दोनूय शिल्लक, आनी ह्या किल्लीची कॅप कितली वापरतात.

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

फारीक करपाची पद्दत

तूं कसो टॉप अप करू शकता, आनी ताची सीमा. लटनींग (Lightning) हीच एक सोप (method) आसा.

GET https://nymbot.ai/api/v1/topup/payment-methods - चावीची गरज ना.

एक टोप-अप १० सावन १,०००,००० सॅट्स पूण; एक प्रो टोप-अपाक सकयलनी एक प्रो क्रेडिट मेळोवंक जाय, देखून तें १०० सॅट्स सावन सुरू जाता. डॉलरचीं सीमा बीटकॉइनच्या किमती प्रमाण बदलता. 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);

लाइटनिंग वाटेन भरपून

एक लायटनिंग इनव्हॉइस तयार करप जे त्या नयम (nym) कडेन क्रेडिट जोडतले जें की की (key) ताच्याकडे आसा. कोणल्याय लायटनिंग वॉलेटाय कडून तें पेय करप, तें तेका तपास ताक 🔍 क्रेडिट जोडपा खातीर.

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ह्या nym खातीर ६० परस चड इन्वॉयस, वा ह्या पत्त्याचेर एका तासांत १२० (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} — invoice korpi nym koddun ek key zai.

status आसा pending (अजून फारीक करूंक ना), paid (पयशां भरल्यात, पूण अजून जमा जावंक ना; परत तपासप), credited (तुमच्या शिल्लकचेर) वा expired (वेळार पावलें ना. (not paid in time). बाकीचे क्षेत्र (balance fields) ती टियर (tier) खातीर आसात जाका इन्व्हॉइस (invoice) टॉप अप करता.

प्रतिसाद

{
  "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पूर्णांक (क्वेरी)ना.डिफॉल्ट १, जास्तीत जास्ती १,०००; चड पान आसा 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 ही एचटीटीपी पद्दत.
  • payload हें हेक्स भाशेंत कच्च्या विनंती बॉडीचें एस. एच. ए.-256 आसा. हें हेक्साचेर गरजेचें आसा. POST आनी PATCH, आनी तुमी धाडपी बॉडी तुमी हॅश केल्ल्या बाईटा खातीर बाईट आसपाक जाय.
  • created_at सर्वरच्या घड्याळा उपरांत 60 सेकंदां भितर आसपाक जाय.
  • प्रत्येक इव्हेंट एक फावटीच काम करता, a GET आस्पाव केला, देखून कॅप्चर केल्लें हेडर परतून चलोवंक मेळना. दर एका विनंत्या खातीर नवें सायन करात. एक जोड nonce यादृच्छिक मोल आशिल्लो टॅग जाका लागून एकाच सेकंदांत स्वाक्षरी केल्ल्यो दोन विनंत्यो अजूनय वेगवेगळ्यो आसतात.
  • स्वाक्षरी केल्ल्या विनंत्याचो भाग चडांत चड 64 के. बी. आसूं येता, आनी कुडीक ताची गरज आसता. Content-Type: application/json.

एक गमलिल्ली घटना परत येता 401 missing_nostr_auth; ek ji khub vait form kela, khub vait sign kela, khub poroni, vo veglo URL, method vo body aslo tem returns invalid_nostr_auth, संदेशांतल्या कारणा वांगडा; परतून वापरिल्लें परत येता nostr_auth_replayed. ह्या एंडपॉइंट्सक आयिल्ली API की नाकारली वता. बॉडी वाचोवचे पयली सिग्नेचर तपासली वता, आनी प्रत्येक ॲड्रेस एका मिनिटांत ३० वेळा फाईल करू शकता (एका IPv6 ॲड्रेसक वचोवपाचो पूर्ण /६४ भाग मानतात); तांयपून तें... 429 वांगडाच Retry-After.

ब्राउझर हे एंडपॉइंट्स फकत Nymbot च्या स्वताच्या साईट्सच्यान सकयलच कॉल करूंक शकतात (https://nymbot.ai, https://nymchat.app आनी तांचे सबडोमेन). खंयच्याय दुसऱ्या साईटचें पान ताका कोर्‌स (CORS) हेडर मेळना, देखून तें तांच्या परत करपी वस्त वाचूंक शकना. स्क्रिप्ट्स आनी नेटिव्ह ॲप्स, जे कसलेच... Origin, प्रभावी जावचे ना.

तुजी गुपीत चावी

सायनींग करपा खातीर तुमच्या एन. आय. एम. ची गुपीत किल्ली जाय ( nsec), जें सगळें नियंत्रीत करताः तुमची वळख, तुमचो इतिहास आनी तुमचें संतुलन. फकत तुमचो विस्वास आशिल्ल्या यंत्राचेर लिपींत दवरात, फायलींत बरोवचे परस वातावरणांतल्यान वाचात, आनी तुमकां शक्य जाल्यार एप पसंत करात.

हे मदतनीस हेडर तयार करतात. ह्या पानाचेर उपरांतच्या उदाहरणांनी तांचो उपेग करतात. ते हेक्सांतली गुपीत किल्ली वाचतात NOSTR_SECRET_HEX; सी. यू. आर. एल. एक वापरतात नाका. कमांड-लायनीचें साधन, जें एन. एस. सी. वा हेक्स किल्ली घेता, आनी 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");
}

खात्याचो सारांश

ॲपच्या API शीटच्या वयर कितें दिसेता: तुमची पब्लिक की, दोनूय बॅलन्स, कितल्या की अ‍ॅक्टिव्ह आसात (रिव्होक जा भुरग्या वा एक्स्पायर जा ना), आनी... स्वयंचालित टॉप-अप सेटिंग्स, वा 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 — सादार (signed).

क्षेत्रप्रकारगरजेचेंवर्णन
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तेदोच सुटून दव, ती कॅप (cap) कणीच रिसेट जावची ना.
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} — सादार (signed).

परतून आययलेलीं वस्तू {"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} — सादार (signed).

खंयचेंय धाड 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} — सादार (signed).

चावी एकाच वेळार थांबयता, बरें जातलें. ती वांगडा वळेरेंत उरता 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 — सादार (signed).

क्षेत्रप्रकारगरजेचेंवर्णन
nwc_urlस्ट्रिंगहयजोडणी स्ट्रिंग, सुरू जाता 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). हेर दोन निमाण्या बिंदूंकय हेंच लागू जाता.

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 — सादार (signed).

जोडिल्ले सारकीच वस्तू परत करता, वांगडा 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 — सादार (signed).

साठयिल्ली कनेक्शन स्ट्रिंग पुसून घालता. आतां कसलेच टॉप-अप्स करपाचें ना. खात्री करपाक, तुमकां तुमचे वॉलेट मदीन कनेक्शन रिव्होक (revoke) करपाक येता.

प्रतिसाद

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

की शिवाय प्रत्येक विनंतीक पैसे दिवप

Lightning वर एक वेळेंत एक विनंती करपाखातीर फिक्स्ड-प्राइस एंडपॉइंट्स खातीर पयसाय दितात, कोणाचेंय की (key) ना, खातीर खातीर (account) ना आनी शिल्लक (balance) ना: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations आनी POST /embeddings. चॅट, प्रतिसाद आनी संदेशांक सदांच किल्लीची गरज आसता. किल्ली आशिल्ल्या विनंतीचें बिल सदचे भशेन शिल्लक दवरतात; किल्ली धाडना तेन्नाच फारीकणीचो प्रवाह सुरू जाता.

Nymbot एकच विचार दोन वर्शनांत सांगता, एकच बॅकएंड सावन: Lightning Labs' L402 (देखील त्याच्या पुराण्या नावान स्वीकारपूत, LSAT) आनी आय. ई. टी. एफ. ड्राफ्ट पेमेंट हाचे वांगडा एच. टी. टी. पी. प्रमाणीकरण येवजण lightning पद्दत आनी charge हेतू. तुमच्या गिरायकाक जें समजता तें वापरात.

तुमचें स्वतःचें सर्वर चलयप

कणा विना पयसा दिल्लें फकत तेन्नाच चालू आसता तेन्ना 🔍 API_L402_SECRET हेंक्स (64 अक्षरां) वा बेस 64 (44) अशे उण्यांत उणें 32 यादृच्छिक बाइट्स धरता. openssl rand -hex 32एकें उणें वा ओळखीक येवपी मान आनी ही वैशिष्ट्य बंद करता आनी ताचें कारण नोंदवता. ताचो फेरबदल करपाक, जुले मान लावन API_L402_SECRET_PREVIOUS एका दिना खातीर: credentials, status URLs आनी तेाच्यांतल्यान केल्लें challenges तेो संपुंचो सावन कार्यांत आसतात.

आव्हान

ना ही विनंती धाड Authorization हेडर. तें वैध आसल्यार कांयच चलचें ना, आनी तुमकां मेळटा 402 Payment Required त्या विनंतीक कितलो खर्च येतलो हाचे खातीर चलन घेवनः एक किल्ली तीच किंमत फारीक करतली, 10 सॅट प्रमाण क्रेडीट वा 100 सॅट प्रो क्रेडीटांत रुपांतरीत जातली आनी पुराय सॅट (उण्यांत उणें 1 सॅट, आनी उण्यांत उणें 0.05 क्रेडीट) जातलें. प्रतिसादांत तीन आसतात. WWW-Authenticate त्याच इनव्हॉइस खाती आव्हानां:

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

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

फारीकणी request पॅरामीटर बेस64युआरएल जे. एस. ओ. एन.: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

आव्हान निमाण्या बिंदूचेर बांदिल्लें आसता, Content-Type (ताचो मिडिया प्रकार आनी, मल्टीपार्टा खातीर, ताची शीम) आनी तुमी धाडिल्ल्या अचूक बॉडी बाईटांच्या एसएचए-256चेर, आनी 15 मिण्टां मेरेन चलता. फारीक केल्या उपरांत, धाड एकसारकें परतून मागणी करा: तेच Content-Type आनी तेच JSON bytes, वा multipart endpoints खातीर (/images/edits, /audio/transcriptions, /audio/translations) एकाच शिमेचो एकूच मल्टी पार्ट बॉडी. चडशे एचटीटीपी लायब्ररी दर खेपे फॉर्म एन्कोड करतना नवी शीम वेंचून काडटात, देखून ती एक फावट एन्कोड करात आनी ती बाइट्स दोन फावटीं धाडात.

दर एका पत्त्याक एका मिनटाक 30 आव्हानां विचारूं येतात (एक आयपीव्ही6 पत्तो पुराय/64 म्हणून मेजतात). ज्याचो पत्तो खबर ना त्यो विनंत्यो दर मिनटाक 10 कडक वांटून घेतात, आनी सगळ्या पत्त्यांचेर निंबोट समस्यांच्या आव्हानांचेर एकंदर मर्यादा आसता; आव्हान दिवचे पयलीं न्हयकारिल्ली विनंती (देखीक वैध जेएसओएन नाशिल्ल्या बॉडीकडेन) ताचे वटेन मेजनात. ताचे भायर जाप आसा 429 वांगडाच Retry-After, कूड वाचपा पयलीं आयिल्लें. की (key) वा क्रेडेंशियल (credential) विणें कडेन जावपी एंडपॉइंट्स (endpoints) तितलीच एक मिनीटाकल्यान एका ॲड्रेसक १२0 अनऑथेन्टिकेटेड (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>"}}

एकें दिल्लेचिए खातीर एक पेड रिक्वेस्ट, की (key) वापरून केल्ल्या सारखीच जाप दिता, पूण तें एकदम तशें न्हयें... nymbot वस्तूक समतोल क्षेत्र नाः {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}, आनी कांयच ना X-Nymbot-Balance-Sats हेडर. फारीकणी येवजणे वांगडा फारीक केल्ली विनंती लेगीत मेळटा Payment-Receipt हेडर (चॅलेंज आय. डी. वांगडा बेस64यु. आर. एल. जे. एस. ओ. एन., पेमेंटाचो हॅश असो reference, status आनी timestamp). पेड रिクエスト्स कश्याच nym सोंदनाच आसात, देखून तांची query historyंत वळख जात ना.

स्थितीकेन्ना?
402 payment_already_usedदर एक फारीकणी एका विनंत्या खातीर फारीक करतात. ह्या विनंत्या खातीर प्रतिसाद हें एक नवें आव्हान, देखून एक गिरायक जो आपलें निमाणें प्रमाणपत्र कॅशे करता (म्हणून lnget करता) फकत परत फारीक करता.
402 payment_mismatchदुसऱ्या एका निमाण्या बिंदू खातीर प्रमाणपत्र जारी केल्लें, Content-Type ki sharir, ki hea vinantichim modotantlean kom bhugtun korta. Hea vinantichi ek navin chinot tazo sobat yeta; jednam bhugtun khub kom aslem, tumi kitem bhugtun kel'lem tem ek... रिफंड टोकन (refund_token आनी refund_sats काळजांतल्यान।
402 payment_expiredचॅलेंज सोंपतकच 15 मिण्टां परस चड वेळ गेलो. ताचे वांगडा एक नवें चॅलेंज येता. प्रीमेजांत तुमी फारीक केल्लें दाखयल्यार, तुमी फारीक केल्लें फारीक जातलें. रिफंड टोकन (refund_token आनी refund_sats कुडींत), एक फावट; उपरांत प्रमाणपत्र वापरतात.
401 invalid_preimageपयलें चित्र चलन फारीक करपाच्या हॅशाक हॅश करचें ना. फारीकणी सोंपची ना.
401 invalid_payment_credentialCredential चुकीच्या रददेंत आसा, Nymbot ताका लागून बदलिल्लां, वा एका अइशें पेमेंट हॅश सांगता जाचो न्हयें Nymbot कडेन कोणचेंही इनव्हॉइस नासलें. Nymbot कडेन नासलेली caveat आसपीलें वा विरोधाभासी caveat आसपीलें macaroon नाकारलेलें वचतले.
429 rate_limit_exceededएका मिनिटांतल्या एका वेळार ३० परस चड क्रेडेंशियल्स वा कीज (keys) व्हेरिफाय करपाक फाल्या जाल्या, वा एक रिफंड टोकन एका मिनिटांत ६० परस चड वेळा धाडल्या. थांब। Retry-After.

cURL

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

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

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

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

lnget

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

Python

import base64, json, re
import requests

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

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

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

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

JavaScript

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

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

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

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

तयार केल्ले गिरायक mppx वीज पद्दतीन पेमेंटाचें आव्हान स्वता हाताळचें; तांकां निमाण्या बिंदूचेर दाखोवचें आनी तांकां फारीक करपाक दिवचें.

व्हिडियो

ए फारीक केल्लें POST /videos उत्तऱां 202 चावी असलें, तशेंच अ status_url: GET कामाचे फाटल्यान वचपा खातीर कसलीच चावी नासता. तें सायन केलां आनी काम दवरल्या मेरेन 24 वरां काम करता.

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

रखचो refund_token ह्या प्रतिसादानसन: तें फकत हांगाच दिसता. व्हिडिओ रेंडर जाताना तें रिकामें आसता (GET /api/v1/l402/refunds उत्तऱां "status": "pending"); जर render unbilled थंय फेल जाल्यार, तर पेमेंट ताचेर येता. Status URL दाखयता refund_sats परत मेळिल्ल्या कामा खातीर पूण टोकन केन्नाच मेळना, देखून स्थिती यू. आर. एल. शेअर केल्यार रिफंड मेळना. टोकन तपासल्यार कोणूच मतदान करूंक नाशिल्लें एक अयशस्वी काम थारता.

परतावे (Refunds)

जरें एक पेड रिक्वेस्ट फेल जाली आनी प्रोव्हायडरने त्या प्रयत्ना खातीर Nymbot कडेन बिलिंग केलें, तर ती पेमेंट राखून दवरतात आनी चुक (error) तें सांगता, हेन्ना... 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 आनी सगळो पयमेंट परत येता. Embeddings तीच वस्त परत दितात जी अंदाजान रोकून दवरली. एकें फेल जाल्लें व्हिडिओ तें टोकन परत करता जे चडयलेल्या प्रमाण वचपें आशिल्लें.

रिफंड टोकन हो एक यादृच्छिक 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 въ, vo call करा POST /api/v1/l402/refunds/redeem एका बरोबर स्वाक्षरी केल्ली विनंती आनी {"refund_token": "REFUND-...", "balance": "standard"} (वा "pro"). पूण क्रेडिट्स बॅलन्स कडेन वतात (standard वरी 10 sats, Pro वरी 100 sats); जे 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"

प्रतिसाद

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