مواد پر جائیں۔
نمبوٹ پر واپس جائیں

علم کی بنیاد ڈویلپرز

توازن، سب سے اوپر اور کلید

چیک کریں کہ آپ کے پاس کیا ہے، لائٹننگ پر ٹاپ اپ کریں، اپنے بٹوے سے خود بخود ٹاپ اپ کریں، دیکھیں کہ ہر درخواست کی قیمت کتنی ہے، اور کوڈ سے چابیاں سنبھال لیں۔

توازن کی جانچ کرنا

دونوں آپ کے توازن، اور اس کلید کا کمرہ کتنا استعمال کیا جاتا ہے.

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
}
حیثیتجب
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 - ایک API کلید کی ضرورت ہے، جو اپنی درخواستیں دیکھتی ہے، یا دستخط شدہ درخواست آپ کی نیم سے، جو ہر کلید کو دیکھتا ہے.

میدانقسممطلوبتفصیل
pageعدد (استفسار)نہیںڈیفالٹ 1، زیادہ سے زیادہ 1, 000 پر ؛ ایک اونچا صفحہ ہے 400 invalid_value.
page_countعدد (استفسار)نہیںفی صفحہ قطاریں۔ ڈیفالٹ 20، زیادہ سے زیادہ 100۔
start_date
end_date
سٹرنگ (استفسار)نہیںآئی ایس او 8601 تاریخیں یا اوقات۔
modelسٹرنگ (استفسار)نہیںصرف یہ ماڈل۔
typeسٹرنگ (استفسار)نہیںchat, responses, messages, image, video, speech, transcription یا embedding.
all_keysبولین (استفسار)نہیںچابی کے ساتھ: true ایک ہی نام کی ہر کلید شامل ہے۔ ڈیفالٹ false.
key_idسٹرنگ (استفسار)نہیںدستخط شدہ درخواست کے ساتھ، یا اس کے ساتھ all_keys=true: صرف یہ کلید۔

جوابات

{
  "data": [
    {
      "id": "q_71c4e9a0",
      "timestamp": "2026-09-30T08:12:00Z",
      "model": "anthropic/claude-sonnet-5",
      "type": "chat",
      "input_tokens": 1240,
      "output_tokens": 380,
      "cached_tokens": 0,
      "cost_sats": 16.2,
      "cost_usd": 0.01895,
      "balance": "pro",
      "key_id": "4f0c9a1be27d3856",
      "web_search": false,
      "status": "ok"
    }
  ],
  "pagination": { "page": 1, "page_count": 20, "total": 311, "total_pages": 16 }
}

cURL

curl "https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat" \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os
import requests

res = requests.get(
    "https://nymbot.ai/api/v1/queries/history",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
    params={"page_count": 50, "type": "chat"},
)
for row in res.json()["data"]:
    print(row["timestamp"], row["model"], row["cost_sats"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat", {
  headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
for (const row of (await res.json()).data) console.log(row.timestamp, row.model, row.cost_sats);

اکاؤنٹ کی درخواستوں پر دستخط کرنا

چابیاں بنانا، تبدیل کرنا اور منسوخ کرنا، اکاؤنٹ کا خلاصہ اور خودکار ٹاپ اپ 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&times؛ مارجن کے ساتھ، کیونکہ حقیقی شمار صرف بعد میں جانا جاتا ہے. ریفنڈ ٹوکن.

ادائیگی بھیجیں

کسی بھی لائیو کی چمچ کے ساتھ اکاؤنٹ ادا کریں. چمچ آپ کو پہلے تصویر، 64 ہیکس حروف فراہم کرتا ہے. پھر ان میں سے ایک کے ساتھ ایک ہی درخواست بھیجیں:

اسکیمہیڈر
میں402Authorization: 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_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 جیسا کہ ایک کلائنٹ ایک ہے، 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 آبجیکٹ)۔ درخواست کے جوابات سے کم قیمت کا ٹوکن۔ 402 refund_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 } }