علم کی بنیاد ڈویلپرز
توازن، سب سے اوپر اور کلید
چیک کریں کہ آپ کے پاس کیا ہے، لائٹننگ پر ٹاپ اپ کریں، اپنے بٹوے سے خود بخود ٹاپ اپ کریں، دیکھیں کہ ہر درخواست کی قیمت کتنی ہے، اور کوڈ سے چابیاں سنبھال لیں۔
یہ صفحہ سہولت کے لیے مشین سے ترجمہ کیا گیا ہے۔ انگریزی اصل وہ ورژن ہے جو لاگو ہوتا ہے۔
توازن کی جانچ کرنا
دونوں آپ کے توازن، اور اس کلید کا کمرہ کتنا استعمال کیا جاتا ہے.
GET https://nymbot.ai/api/v1/credits/balance - ایک API کلید کی ضرورت ہے۔ POST یہ ان گاہکوں کے لیے بھی کام کرتا ہے جو اس کی توقع رکھتے ہیں۔
balance Bitcoin کی موجودہ قیمت پر ڈالر میں دونوں توازن ایک دوسرے کے ساتھ ہیں، اس کے لئے آلات جو ایک واحد نمبر کی توقع کرتے ہیں (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 صرف طریقہ ہے.
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 - ایک API کلید کی ضرورت ہے۔
| میدان | قسم | مطلوب | تفصیل |
|---|---|---|---|
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) یا جھلکنے والی کیفے کی طرف سے انکار کیا گیا ہے (amount_out_of_range). |
429 | اس این آئی ایم کے لیے 60 سے زیادہ رسیدیں، یا اس پتے سے 120، ایک گھنٹے میں (rate_limit_exceededکے ساتھ Retry-After). |
502 | ابھی کوئی انوائس نہیں بنایا جا سکا (invoice_unavailableکے ساتھ Retry-After). |
cURL
curl https://nymbot.ai/api/v1/topup/create/btc-lightning \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"amount": 10000, "currency": "SATS", "tier": "pro"}'
Python
import os
import requests
res = requests.post(
"https://nymbot.ai/api/v1/topup/create/btc-lightning",
headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
json={"amount": 10000, "currency": "SATS", "tier": "pro"},
)
invoice = res.json()
print(invoice["payment_request"])
JavaScript
const res = await fetch("https://nymbot.ai/api/v1/topup/create/btc-lightning", {
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.NYMBOT_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ amount: 10000, currency: "SATS", tier: "pro" }),
});
const invoice = await res.json();
console.log(invoice.payment_request);
ٹاپ اپ چیک کرنا
یہ پوچھتا ہے کہ آیا انوائس کی ادائیگی کر دی گئی ہے اور اس کے ہونے کے بعد کریڈٹ کا اضافہ ہوتا ہے۔ چیک کرنا وہ ہے جو اسے کریڈٹ کرتا ہے، اس لیے ادائیگی کے بعد، اس وقت تک چیک کریں جب تک کہ اسٹیٹس درست نہ ہو جائے۔ creditedبعد میں دوبارہ چیک کرنا محفوظ ہے: کریڈٹ ایک بار گر جاتا ہے، چاہے آپ کتنی ہی بار پوچھیں۔
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - این آئی ایم سے ایک چابی درکار ہے جس نے انوائس بنائی تھی۔
status ہے pending (ابھی تک ادائیگی نہیں کی گئی)، paid (ادا شدہ، لیکن ابھی تک کریڈٹ نہیں ؛ دوبارہ چیک کریں)، credited (آپ کے حساب سے) یا expired (وقت پر ادائیگی نہیں کی گئی)۔ بقایا فیلڈز اس درجے کے لیے ہیں جس میں انوائس سب سے اوپر ہے۔
جوابات
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| حیثیت | جب |
|---|---|
400 | ID پیدا کرنے والے کال سے 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 - ایک API کلید کی ضرورت ہے، جو اپنی درخواستیں دیکھتی ہے، یا دستخط شدہ درخواست آپ کی نیم سے، جو ہر کلید کو دیکھتا ہے.
| میدان | قسم | مطلوب | تفصیل |
|---|---|---|---|
page | عدد (استفسار) | نہیں | ڈیفالٹ 1، زیادہ سے زیادہ 1, 000 پر ؛ ایک اونچا صفحہ ہے 400 invalid_value. |
page_count | عدد (استفسار) | نہیں | فی صفحہ قطاریں۔ ڈیفالٹ 20، زیادہ سے زیادہ 100۔ |
start_dateend_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);
اکاؤنٹ کی درخواستوں پر دستخط کرنا
چابیاں بنانا، تبدیل کرنا اور منسوخ کرنا، اکاؤنٹ کا خلاصہ اور خودکار ٹاپ اپ API کلید نہیں لیتے۔ وہ آپ کے NIM سے دستخط لیتے ہیں، لہذا ایک لیک ہونے والی کلید اپنی ٹوپی تک خرچ کر سکتی ہے لیکن کبھی بھی دوسری کلید نہیں بنا سکتی یا اپنی ٹوپی نہیں بڑھا سکتی۔
ایپ آپ کے لیے یہ کرتی ہے: اس میں موجود ہر چیز آگ شیٹ ان اختتامی نکات کا استعمال کرتی ہے۔ آپ کو صرف اپنے کوڈ سے چابیاں سنبھالنے کے لیے اس حصے کی ضرورت ہے۔
دستخط 27235 (این آئی پی-98) قسم کا ایک نوسٹر واقعہ ہے، جس میں بیس 64-انکوڈ کیا گیا ہے
Authorization الفاظ کے ساتھ header 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بے ترتیب قیمت کے ساتھ ٹیگ کریں تاکہ ایک ہی سیکنڈ میں دستخط شدہ دو درخواستیں اب بھی مختلف ہوں۔ - دستخط شدہ درخواست کا باڈی زیادہ سے زیادہ 64 کے بی ہو سکتا ہے، اور باڈی کو اس کی ضرورت ہوتی ہے۔
Content-Type: application/json.
ایک گمشدہ واقعہ کی واپسی 401 missing_nostr_authوہ جو بری طرح تشکیل شدہ ہو، بری طرح سے دستخط شدہ ہو، بہت پرانا ہو، یا کسی مختلف یو آر ایل، طریقہ یا باڈی ریٹرن کے لیے ہو۔
invalid_nostr_auth ،جیسا کہ اس کا مطلب یہ ہے کہ ایک بار پھر
nostr_auth_replayedان اختتامی نکات پر بھیجی گئی API کلید کو مسترد کر دیا جاتا ہے۔ باڈی کو پڑھنے سے پہلے دستخط کی جانچ پڑتال کی جاتی ہے، اور ہر ایڈریس ایک منٹ میں 30 بار ناکام ہو سکتا ہے (ایک IPv6 ایڈریس اس کے پورے/64 کے طور پر شمار ہوتا ہے) ؛ اس کے بعد یہ ہو جاتا ہے 429 کے ساتھ
Retry-After.
براؤزر ان اختتامی نکات کو صرف نمبوٹ کی اپنی سائٹوں سے کال کر سکتے ہیں (https://nymbot.ai,
https://nymchat.app اور ان کے ذیلی ڈومینز)۔ کسی بھی دوسری سائٹ پر ایک پیج کو کوئی سی او آر ایس ہیڈر واپس نہیں ملتا ہے، اس لیے یہ نہیں پڑھ سکتا کہ وہ کیا واپس کرتے ہیں۔ اسکرپٹ اور مقامی ایپس، جو نہیں بھیجتے ہیں
Origin، متاثر نہیں ہوتے ہیں۔
Signing needs your nym's secret key (آپ کی نیم کا خفیہ کلید) nsec)، جو ہر چیز کو کنٹرول کرتا ہے: آپ کی شناخت، آپ کی تاریخ اور آپ کا توازن۔ اسے صرف ایک ایسی مشین پر اسکرپٹ میں رکھیں جس پر آپ اعتماد کرتے ہیں، اسے فائل میں لکھنے کے بجائے ماحول سے پڑھیں، اور جب آپ کر سکتے ہیں تو ایپ کو ترجیح دیں۔
یہ مددگار ہیڈر بناتے ہیں۔ اس صفحہ پر بعد کی مثالیں ان کا استعمال کرتی ہیں۔ وہ ہیکس میں خفیہ کلید کو اس سے پڑھتے ہیں۔ NOSTR_SECRET_HEXcURL استعمال کرتا ہے
پیارے کمانڈ لائن ٹول، جو ایک این ایس ای سی یا ہیکس کلید لیتا ہے، اور 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");
}
اکاؤنٹ کا خلاصہ
اپلی کیشن کے 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 - دستخط شدہ۔
| میدان | قسم | مطلوب | تفصیل |
|---|---|---|---|
include_revoked | بولین (استفسار) | نہیں | منسوخ کی گئی چابیاں شامل کریں۔ ڈیفالٹ false. |
جوابات
{ "data": [ { "id": "4f0c9a1be27d3856", "name": "laptop scripts", "hint": "sk-nymbot-Qm7x…c2Lw", "...": "..." } ] }
cURL
URL=https://nymbot.ai/api/v1/keys
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys"
for key in requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"]:
print(key["id"], key["name"], key["period_used_sats"], key["limit_sats"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys";
const { data } = await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json();
for (const key of data) console.log(key.id, key.name, key.period_used_sats, key.limit_sats);
چابی بنانا
POST https://nymbot.ai/api/v1/keys - دستخط شدہ۔ واپسی 201.
| میدان | قسم | مطلوب | تفصیل |
|---|---|---|---|
name | سٹرنگ | جی ہاں | 1 سے 40 شرائط، آپ کے دیگر فعال کلیدوں سے مختلف (مزید کیس) |
limit_sats | پورے | نہیں | اخراجات کی حد، کم از کم 1۔ اسے بغیر کسی حد کے چھوڑ دیں۔ |
reset_period | سٹرنگ | نہیں | daily, weekly یا monthlyکی ضرورت limit_satsاسے ایک کیپ کے لئے چھوڑ دو جو کبھی دوبارہ نہیں کریں گے. |
expire_at | سٹرنگ یا انٹیجر | نہیں | جب کلید کام کرنا بند کر دیتی ہے: ایک آئی ایس او 8601 وقت، یا 1970 سے ملی سیکنڈ۔ |
جواب (201)
{
"data": {
"id": "4f0c9a1be27d3856",
"name": "laptop scripts",
"hint": "sk-nymbot-Qm7x…c2Lw",
"limit_sats": 20000,
"reset_period": "monthly",
"key": "sk-nymbot-Qm7x...c2Lw",
"...": "the rest of the key object"
}
}
| حیثیت | جب |
|---|---|
400 | ایک نام کمزور یا بہت طویل ہے؛ پہلے سے ہی استعمال کیا گیا نام (duplicate_name) ؛ ایک ٹوپی جو کم از کم 1 کی مکمل تعداد نہیں ہے ؛ ٹوپی کے بغیر ری سیٹ پیریڈ ؛ ماضی میں ایکسپائری ؛ ایک نامعلوم فیلڈ (unknown_parameter)؛ یا 25 فعال کلید پہلے سے ہی (too_many_keys). |
429 | اس نیم کی طرف سے بنائی گئی 60 سے زیادہ چابیاں، یا اس پتے سے 120، ایک گھنٹے میں (rate_limit_exceededکے ساتھ Retry-After). |
cURL
URL=https://nymbot.ai/api/v1/keys
BODY='{"name":"laptop scripts","limit_sats":20000,"reset_period":"monthly"}'
curl "$URL" \
-H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json
import requests
url = "https://nymbot.ai/api/v1/keys"
body = json.dumps({"name": "laptop scripts", "limit_sats": 20000, "reset_period": "monthly"}).encode()
res = requests.post(
url,
data=body,
headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"]["key"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys";
const body = JSON.stringify({ name: "laptop scripts", limit_sats: 20000, reset_period: "monthly" });
const res = await fetch(url, {
method: "POST",
headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
body,
});
console.log((await res.json()).data.key);
ایک کلید پڑھنا
GET https://nymbot.ai/api/v1/keys/{id} - دستخط شدہ۔
واپسی {"data": {…}} کلیدی شے کے ساتھ، یا 404
key_not_found اگر آپ کے پاس اس کی شناخت نہیں ہے.
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
console.log((await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json()).data);
کلید تبدیل کرنا
PATCH https://nymbot.ai/api/v1/keys/{id} - دستخط شدہ۔
ان میں سے کوئی بھیجیں name, limit_sats, reset_period اور
expire_at، ایک ہی قوانین کے ساتھ، جیسے ایک کلید بنانے کے لئے. null ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیسے ،جیس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());
NWC آٹو ٹاپ اپ
لائٹننگ والیٹ کو نوسٹر والیٹ کنیکٹ سے مربوط کریں اور جب اے پی آئی کے اخراجات کم ہوتے ہیں تو نمبوٹ خود ہی توازن کو بڑھاتا ہے۔ ایپ کی اے پی آئی شیٹ کی ترتیبات ایک جیسی ہوتی ہیں۔ یہ اس کے پیچھے کے اختتامی نکات ہیں۔ ان سب کو ایک توازن کی ضرورت ہوتی ہے۔ دستخط شدہ درخواست.
یہ کیسے کام کرتا ہے: اے پی آئی کی درخواست کے بعد آپ کے منتخب کردہ بیلنس پر چارج کیا جاتا ہے، اگر وہ بیلنس آپ کی حد سے نیچے گر گیا ہے، تو نمبوٹ آپ کی ٹاپ اپ رقم کے لیے انوائس بناتا ہے، آپ کے بٹوے سے اسے ادا کرنے کو کہتا ہے، اور کریڈٹ شامل کرتا ہے۔ یہ ہر 5 منٹ میں زیادہ سے زیادہ ہر 5 منٹ میں ٹاپ اپ ہوتا ہے، اس لیے درخواستوں کا ایک سلسلہ بٹوے کو ختم نہیں کر سکتا۔ ایپس میں خرچ کرنا اسے متحرک نہیں کرتا ہے۔ آخری ٹاپ اپ کا وقت اور سائز، اور آخری غلطی، ترتیبات میں ہیں۔ اگر ادائیگی غلطی کے بعد ہوئی تو، اس کے انوائس کو چیک کریں ٹاپ اپ اسٹیٹس اس کا سہرا دیں۔
Nymbot اس کو خفیہ طور پر ذخیرہ کرتا ہے اور صرف کبھی اس کے اپنے اوپر اپ فرائض ادا کرنے کے لئے استعمال کرتا ہے، لیکن صرف اس کے لئے ایک کنکشن بنائیں، آپ کے کیفے میں ایک اخراجات budgets کے ساتھ، لہذا سب سے زیادہ وہ کبھی ادائیگی کر سکتے ہیں ایک نمبر آپ کو منتخب کیا ہے. pay_invoice.
ایک کیفے سے رابطہ کریں
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect - دستخط شدہ۔
| میدان | قسم | مطلوب | تفصیل |
|---|---|---|---|
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 - دستخط شدہ۔
اسی آبجیکٹ کو واپس کرتا ہے جس کے ساتھ منسلک ہوتا ہے 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());
کلید کے بغیر درخواست پر ادائیگی
فکسڈ قیمت اختیارات Lightning کے دوران ایک درخواست کے لئے ادا کیا جا سکتا ہے، کوئی کلید، کوئی اکاؤنٹ اور کوئی توازن نہیں: POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations اور POST /embeddingsچیٹ، جوابات اور پیغامات کو ہمیشہ ایک کلید کی ضرورت ہوتی ہے. ایک کلید رکھتا ہے کہ ایک درخواست عام طور پر توازن میں چارج کیا جاتا ہے؛ ادائیگی کے بہاؤ صرف شروع ہوتا ہے جب کوئی کلید بھیج دیا جاتا ہے.
نمبوٹ ایک ہی خیال کے دو ورژن بولتا ہے، ایک بیک اینڈ سے: لائٹننگ لیبز '
میں402 (اور اس کے سابق نام کے تحت بھی قبول کیا گیا ہے) LSAT) اور IETF پروجیکٹ
ادائیگی کے ساتھ ایچ ٹی ٹی پی تصدیق اسکیم lightning طریقہ اور
charge ارادہ۔ جو بھی آپ کا کلائنٹ سمجھے اسے استعمال کریں۔
ایک کلید کے بغیر ادائیگی صرف اس وقت ہے جب API_L402_SECRET کم از کم 32 بے ترتیب بائٹ، ہیکس (64 علامات) یا base64 (44) کے طور پر رکھتا ہے. openssl rand -hex 32ایک مختصر یا ممکنہ طور پر قابل اندازہ قیمت فہرست کو غیر فعال کرتا ہے اور اس کے لئے کیوں لاگ ان کرتا ہے. API_L402_SECRET_PREVIOUS ایک دن کے لئے: اعترافات، حالت URLs اور اس کے تحت کئے گئے چیلنجز ختم ہونے تک کام کرتے رہیں.
چیلنج
No کے ساتھ درخواست بھیجیں 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 اور وہی جے ایس او این بائٹس، یا ملٹی پارٹ اینڈ پوائنٹس کے لیے (/images/edits, /audio/transcriptions, /audio/translationsزیادہ تر HTTP لائبریریز ہر بار ایک فارم کو کوڈ کرتے وقت ایک نیا حد منتخب کرتے ہیں، لہذا اسے ایک بار کوڈ کریں اور ان بائٹس کو دو بار بھیجیں.
ہر ایڈریس ایک منٹ میں 30 چیلنجز کا مطالبہ کر سکتا ہے (ایک آئی پی وی 6 ایڈریس اس کے پورے/64 کے طور پر شمار ہوتا ہے)۔ درخواستیں جن کا ایڈریس معلوم نہیں ہے وہ ایک سخت 10 فی منٹ کا اشتراک کرتی ہیں، اور تمام پتے پر نمبوٹ کے مسائل پر مجموعی حد ہوتی ہے۔ چیلنج کیے جانے سے پہلے مسترد کی گئی درخواست (مثال کے طور پر ایک باڈی کے ساتھ جو درست جے ایس او این نہیں ہے) اس کی طرف شمار نہیں ہوتی ہے۔ اس کے علاوہ جواب ہے 429 کے ساتھ Retry-After، باڈی کو پڑھنے سے پہلے بھیجا جاتا ہے۔ بغیر کسی کلید یا اسناد کے کال کیے جانے والے ادا شدہ اختتامی نکات بھی فی پتے پر ایک منٹ میں 120 غیر تصدیق شدہ درخواستوں کی عمومی حد کی طرف شمار ہوتے ہیں۔ باڈی کو پڑھنے سے پہلے ایک اسناد کی جانچ کی جاتی ہے، اور ایک درخواست جس کی تصدیق کی جاتی ہے۔ Content-Type نہیں ہے application/json (یا
multipart/form-data اپ لوڈ کے لیے) کے ساتھ انکار کر دیا گیا ہے 415 اور کبھی انوائس نہیں ملتا۔
انٹرویوز انٹرویو میں ٹوکن کی ایک تبادلہ خیال سے قیمت کی جاتی ہیں، 1.5×؛ مارجن کے ساتھ، کیونکہ حقیقی شمار صرف بعد میں جانا جاتا ہے. ریفنڈ ٹوکن.
ادائیگی بھیجیں
کسی بھی لائیو کی چمچ کے ساتھ اکاؤنٹ ادا کریں. چمچ آپ کو پہلے تصویر، 64 ہیکس حروف فراہم کرتا ہے. پھر ان میں سے ایک کے ساتھ ایک ہی درخواست بھیجیں:
| اسکیم | ہیڈر |
|---|---|
| میں402 | Authorization: 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 header (base64url JSON with the challenge id، ادائیگی ہیش کے طور پر reference, status اور
timestamp)۔ ادا شدہ درخواستیں کسی بھی این آئی ایم سے منسلک نہیں ہیں، اس لیے وہ استفسار کی تاریخ میں ظاہر نہیں ہوتی ہیں۔
| حیثیت | جب |
|---|---|
402 payment_already_used | ہر ادائیگی ایک درخواست کے لیے ادائیگی کرتی ہے۔ جواب اس درخواست کے لیے ایک نیا چیلنج ہے، لہذا ایک کلائنٹ جو اپنی آخری اسناد کو کیش کرتا ہے (جیسا کہ lnget کرتا ہے) بس دوبارہ ادائیگی کرتا ہے۔ |
402 payment_mismatch | ایک اور نقطہ نظر کے لئے کریڈٹنگ کی گئی تھی، Content-Type یا باڈی، یا اس درخواست سے کم ادا کرتا ہے اب لاگت آتی ہے۔ اس درخواست کے لیے ایک نیا چیلنج اس کے ساتھ آتا ہے ؛ اگر ادائیگی بہت کم تھی، تو جو آپ نے ادا کیا وہ ایک رقم کے طور پر واپس آتا ہے۔ ریفنڈ ٹوکن (refund_token اور refund_sats جسم میں ) |
402 payment_expired | چیلنج کے بعد 15 سے زائد منٹ گزر چکے ہیں. ایک نیا چیلنج اس کے ساتھ آتا ہے. اگر پہلے تصویر دکھاتا ہے کہ آپ نے ادا کیا ہے، جو آپ نے ادا کیا ہے، ایک چیلنج کے طور پر واپس آتا ہے. ریفنڈ ٹوکن (refund_token اور refund_sats جسم میں)، ایک بار ؛ اس کے بعد اسناد کا استعمال کیا جاتا ہے۔ |
401 invalid_preimage | پری امیج انوائس کے پیمنٹ ہیش کو ہیش نہیں کرتا ہے۔ ادائیگی ختم نہیں ہوئی ہے۔ |
401 invalid_payment_credential | شناختی طور پر غلطی ہوئی ہے، Nymbot نے اسے جاری کرنے کے بعد تبدیل کیا گیا ہے، یا ایک ادائیگی ہیش کا نام ہے Nymbot نے کبھی بھی ایک فہرست جاری نہیں کیا ہے. |
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 جیسا کہ ایک کلائنٹ ایک ہے، plus a
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 ناکام ہو جاتا ہے، ادائیگی اس پر land.
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آبجیکٹ)۔ درخواست کے جوابات سے کم قیمت کا ٹوکن۔402refund_insufficientایک غیر بل شدہ ناکامی سیٹوں کو اسی ٹوکن پر واپس رکھتی ہے۔ - اسے چیک کریں۔
GET /api/v1/l402/refundsاسی ہیڈر کی واپسی کے ساتھ{"sats": 237, "status": "open", "expires_at": "..."}. - ایک ٹوکن ایک منٹ میں زیادہ سے زیادہ 60 بار استعمال کیا جا سکتا ہے.
- اسے ایک NIM پر منتقل کریں. اس میں شامل کریں ایک تحفہ بنائیں Nymbot ایپ میں، یا کال
POST /api/v1/l402/refunds/redeemاے کے ساتھ دستخط شدہ درخواست اور{"refund_token": "REFUND-...", "balance": "standard"}(یا"pro"کل کریڈٹ توازن میں جائیں گے (10 پیسہ ہر ایک معیاری، 100 پرو پر); پیسہ جو API درخواستوں کے لئے ٹوکن پر ایک مکمل کریڈٹ رہنے نہیں کرتے ہیں.
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 } }