सामग्री पर जाएं
निम्बॉट पर वापस जाएँ

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

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

जांचें कि आपके पास क्या है, लहर पर ऊपर उठाएं, स्वचालित रूप से अपने वॉलेट से ऊपर उठाएं, देखें कि प्रत्येक अनुरोध कितना खर्च करता है, और कोड से कुंजी प्रबंधित करें।

संतुलन की जाँच करना

दोनों आपके संतुलन, और इस कुंजी के कैप का कितना उपयोग किया जाता है।

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डॉलर को वर्तमान Bitcoin मूल्य पर परिवर्तित किया जाता है।
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
}
स्थितिजब
400ID कॉल से 64-व्यक्तियों का ID नहीं है।
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अद्वितीय (query)नहीं।डिफ़ॉल्ट 1, अधिकतम 1,000 पर; एक उच्च पृष्ठ है 400 invalid_value.
page_countअद्वितीय (query)नहीं।प्रति पृष्ठ पंक्तियाँ। पूर्वनिर्धारित 20, अधिकतम 100।
start_date
end_date
सॉफ्टवेयर (query)नहीं।आईएसओ 8601 तिथियाँ या समय।
modelसॉफ्टवेयर (query)नहीं।केवल इस मॉडल
typeसॉफ्टवेयर (query)नहीं।chat, responses, messages, image, video, speech, transcription या embedding.
all_keysबूलियन (प्रश्न)नहीं।एक कुंजी के साथ: true एक ही नाम की प्रत्येक कुंजी शामिल है। डिफ़ॉल्ट false.
key_idसॉफ्टवेयर (query)नहीं।एक हस्ताक्षरित अनुरोध के साथ, या 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);

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

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

ऐप आपके लिए यह करता है: सब कुछ अपने एपीआई Sheet इन Endpoints का उपयोग करता है. आपको केवल अपने कोड से कुंजी प्रबंधित करने के लिए इस अनुभाग की आवश्यकता है.

हस्ताक्षर एक प्रकार के 27235 (NIP-98) की Nostr घटना है, जो Base64 कोड में भेजा गया है। Authorization शब्द के साथ शीर्षक Nostr सामनेः

यह घटना

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

एक लापता घटना लौटती है 401 missing_nostr_authएक जो खराब रूप से बनाया गया है, खराब हस्ताक्षर किया गया है, बहुत पुराना है, या एक अलग यूआरएल, विधि या शरीर के लिए वापस आता है invalid_nostr_authफिर भी, एक संदेश में कारण के साथ; एक पुनः उपयोग एक वापस आता है nostr_auth_replayedइन अंत बिंदुओं को भेजे गए एपीआई कुंजी को अस्वीकार कर दिया जाता है। हस्ताक्षर को शरीर को पढ़ने से पहले चेक किया जाता है, और प्रत्येक पते को प्रति मिनट 30 बार असफल किया जा सकता है (एक आईपीवी 6 पते को पूरे /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पूर्णांकनहीं।निवेश कैप में sats, कम से कम 1. इसे बिना कैप के बाहर छोड़ दें।
reset_periodस्ट्रिंगनहीं।daily, weekly या monthlyजरूरतें limit_satsइसे एक टोपी के लिए छोड़ दें जो कभी भी पुनर्स्थापित नहीं होता है।
expire_atstring या integer के साथनहीं।जब कुंजी काम करना बंद कर देती है: एक आईएसओ 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 किसी भी क्षेत्र को साफ करता है: कोई कैप नहीं, कोई रिसेट नहीं, कोई समाप्ति नहीं। रिसेट अवधि को बदलने से एक नया अवधि शून्य पर शुरू होता है. एक रद्द कुंजी को बदल नहीं जा सकता (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());

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

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

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

बटुआ जोड़ने से पहले

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

एक बटुआ को कनेक्ट करें

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect - हस्ताक्षर किए।

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

प्रतिक्रिया

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

cURL

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

Python

import json, os
import requests

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

JavaScript

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

सेटिंग्स को पढ़ना

GET https://nymbot.ai/api/v1/nwc-auto-topup - हस्ताक्षर किए।

कनेक्शन के रूप में एक ही वस्तु को वापस देता है, साथ connected: false अन्य क्षेत्रों में null जब कोई वॉलेट कनेक्ट नहीं है. कनेक्शन श्रृंखला खुद कभी नहीं लौटाया जाता है.

cURL

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

Python

import requests

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

JavaScript

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

डिस्कनेक्ट

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection - हस्ताक्षर किए।

संग्रहीत कनेक्शन श्रृंखला को हटाता है. कोई और शीर्ष-अप नहीं बनाया जाता है. सुनिश्चित करने के लिए, आप अपने वॉलेट में कनेक्शन को भी रद्द कर सकते हैं.

प्रतिक्रिया

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

cURL

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

Python

import requests

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

JavaScript

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

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

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

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

अपना खुद का सर्वर चलाएँ

बिना चाबी के भुगतान तभी चालू होता है जब API_L402_SECRET कम से कम 32 यादृच्छिक बाइट्स रखता है, जैसे हेक्स (64 वर्ण) या base64 (44). openssl rand -hex 32एक छोटा या अनुमानित मूल्य फ़ीचर को बंद करता है और रिकॉर्ड करता है क्यों। API_L402_SECRET_PREVIOUS एक दिन के लिए: प्रमाण पत्र, स्थिति URLs और इसके तहत किए गए चुनौतियों को समाप्त होने तक काम करना जारी रखता है।

चुनौती

नहीं के साथ अनुरोध भेजें 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 निम्नलिखित parameters base64url JSON हैं: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

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

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

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

भुगतान भेजने

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

योजनाहेडर
एल402Authorization: L402 <macaroon>:<preimage> (LSAT काम भी करते हैं)
भुगतानAuthorization: Payment <base64url JSON>जहां 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 header (base64url JSON with the challenge id, भुगतान हैश के रूप में reference, status और timestampभुगतान किए गए अनुरोध किसी भी nym से जुड़े नहीं हैं, इसलिए वे अनुरोध इतिहास में प्रदर्शित नहीं होते हैं।

स्थितिजब
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योग्यता विकृत है, इसे Nymbot द्वारा जारी किए जाने के बाद बदल दिया गया है, या एक भुगतान हैश का नाम Nymbot ने कभी भी एक बिल जारी नहीं किया है।
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"); यदि रेंडर अनबिल करने में विफल रहता है, तो भुगतान उस पर आ जाता है। स्थिति यू. आर. एल. दिखाता है 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-बिट कोड है. Nymbot केवल अपने हैश को संग्रहीत करता है, और यह 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 A के साथ अनुरोध पर हस्ताक्षर और {"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 } }