بڕۆ بۆ ناوەڕۆکەکە
گەڕانەوە بۆ Nymbot

بنکەی زانیاری گەشەپێدەران

باڵانس، زیادکردنی شارتی کارت و کلیلەکان

ئەوەی لای خۆت هەیە پشکنین بکە، لە ڕێگەی Lightning ڤە زیاد بکە، بە شێوەیەکی خۆکار لە ناو پارەدانەکەتەوە (wallet) زیاد بکە، ببینە هەر داواکارییەک چەند تێچووی هەبووە، و کلیلەکان لە ڕێگەی کۆدەوە بەڕێوە ببە.

پشکنینی باڵانسەکە

هەردوو باڵانسەکەت، و ئەوەی کە چەند لە سنووری ئەم کلیلییە بەکارهاتووە.

GET https://nymbot.ai/api/v1/credits/balance — پێویستی بە کلیلێکی API هەیە. POST بۆ ئەو کڕیارانەش کار دەکات کە چاوەڕێی ئەوە دەکەن.

balance ئایا دوو هاوسەنگەکە پێکەوە بە دۆلار لە نرخى ئێستای بیتکۆین، بۆ ئەو ئامرازانەی کە چاوەڕێی یەک ژمارەیان دەکات (null (ئەگەر نرخەکە نەخوێندرێت). ئەوەی تری لە کریدیت و ساتدایە، کە بەو شێوەیە هاوسەنگییەکان لە ڕاستیدا دەپارێزرێن. key وەسفی ئەو کلیلە دەکات کە داوا کربوو. کلیلێک کە گەیشتووەتە سنوورەکەی، هێشتا دەتوانێت باڵانسەکە checkers بکات.

وەڵام

{
  "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 — پێویستی بە کلیل نییە.

بارکردنەکە لە ١٠ بۆ ١,٠٠٠,٠٠٠ ساتسە؛ بارکردنی Pro دەبێت لانی کەم یەک کرێدی Pro بکڕێت، بۆیە لە ١٠٠ ساتسەوە دەست پێدەکات. سنوورە دۆلارییەکان پابەندی نرخەکەی بیتکوینن. bulk_bonus لیستکردنی کۆدە زیادەکان لەسەر زیادکردنەوەی باڵاتر، ڕێک وەک ناو ئەپەکە: ١٠٪، ١٥٪ یان ٢٠٪ زیاتر لەسەر زیادکردنەوەی ئاسایی لە ٥٠٠، ١،٠٠٠ یان ٥،٠٠٠ ساتۆشی، و لەسەر زیادکردنەوەی پرۆ لە ٥،٠٠٠، ١٠،٠٠٠ یان ٥٠،٠٠٠ ساتۆشی.

وەڵام

{
  "supported_methods": [
    {
      "method": "btc-lightning",
      "display_name": "Bitcoin Lightning",
      "supported_currencies": ["SATS", "USD", "BTC"],
      "limits": {
        "SATS": { "min": 10, "max": 1000000 },
        "USD": { "min": 0.02, "max": 1170 },
        "BTC": { "min": 1e-7, "max": 0.01 }
      },
      "tiers": ["standard", "pro"],
      "default_tier": "pro",
      "tier_min_sats": { "standard": 10, "pro": 100 },
      "sats_per_credit": { "standard": 10, "pro": 100 },
      "bulk_bonus": [
        { "bonus": 0.1, "standard_sats": 500, "pro_sats": 5000 },
        { "bonus": 0.15, "standard_sats": 1000, "pro_sats": 10000 },
        { "bonus": 0.2, "standard_sats": 5000, "pro_sats": 50000 }
      ]
    }
  ]
}

cURL

curl https://nymbot.ai/api/v1/topup/payment-methods

Python

import requests

methods = requests.get("https://nymbot.ai/api/v1/topup/payment-methods").json()
print(methods["supported_methods"][0]["limits"])

JavaScript

const methods = await (await fetch("https://nymbot.ai/api/v1/topup/payment-methods")).json();
console.log(methods.supported_methods[0].limits);

بارکردنەوە لە ڕێگەی Lightning

فاتورێکی Lightning دروست دەکات کە کرێ بۆ nym زیاد دەکات کە کلیەکە هیەتی. لە هەر جەمەدانی Lightning (Lightning wallet) یەکەوە بیPlpay بکە، پاشان پشکنین بکە بۆ ئەوەی کرێدیتەکە زیاد بکرێت.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning — پێویستی بە کلیلێکی API هەیە.

بوارنووسینپێویستەوەسف
amountژمارەبەڵێبە چەند، لە... currencyژمارەیەکی تەواو بۆ ساتەکان.
currencyگیر</li>نەخێرSATS (بە دیاریکراوی)، USD یان BTCدۆلارەکان بە نرخی ئێستای بیتکۆین دەگۆڕدرێن.
tierگیر</li>نەخێرpro (ئەوەی بە شێوەی خۆماڵییە) یان standard: کرێدیتەکە بۆ کام باڵانس دەچێت.

کڕینێکی ستاندارد ١٠ ساتە و کڕینێکی پرۆ ١٠٠ ساتە، جگە لە هەر بۆنوسێکی کڕینی بە کۆڵەکە؛ credits دەڵێت ئەم فاکتەرە چی زیاد دەکات.

وەڵام

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
بارودۆخکەی
400ڕێگەیەکی تری لە ڕێگادا (unsupported_method), دراوی نەناسراو (unsupported_currency) یان ئاست، بڕێکی ونبوو، یان بڕێک لە خوار کەمترین بڕ (amount_too_small), زیاتر لە ١,٠٠٠,٠٠٠ ساتس (amount_too_largeیان لەلایەن پارەدانی Lightning ڕەتکرایەوە (amount_out_of_range).
429زیاتر لە ٦٠ فاکتۆر بۆ ئەم nym، یان ١٢٠ لەم ناونیشانەوە، لە کاتێکی یەک کاتدا (rate_limit_exceeded، لەگەڵ Retry-After).
502لە ئێستادا ناتوانرێت هیچ فاکتۆرەیەک دروست بکرێت (invoice_unavailable، لەگەڵ Retry-After).

cURL

curl https://nymbot.ai/api/v1/topup/create/btc-lightning \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount": 10000, "currency": "SATS", "tier": "pro"}'

Python

import os
import requests

res = requests.post(
    "https://nymbot.ai/api/v1/topup/create/btc-lightning",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
    json={"amount": 10000, "currency": "SATS", "tier": "pro"},
)
invoice = res.json()
print(invoice["payment_request"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/topup/create/btc-lightning", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.NYMBOT_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ amount: 10000, currency: "SATS", tier: "pro" }),
});
const invoice = await res.json();
console.log(invoice.payment_request);

پشکنینی پرکردنەوەی بار (top-up)

دەپرسێت ئایا پسوڵەکەیدەدراوە و، کاتێک دراو، کرێدیتەکە زیاد دەکات. پشکنین ئەوەیە کێ کرێدیت دەکات، بۆیە دوای دران، پشکنین بکە تاوەکو بارودۆخەکە دەبێتە creditedدوبارە پشکنینەوە دوای ئەوە سەلامەتە: کۆشکە/کڕینەکە تەنها یەک جار دێت، هەرچەند جارێک داوای بکەیت.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — پێویستی بە کلیلێکە لەو ناوەی (nym) کە فاکتورەکەی دروست کردووە.

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) ئەو ناسنامە ٦٤ خەرەکتەرەی ناو بانگی دروستکردنەکە (create call) نییە.
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);

مێژووی پرسیارەکان

هەر داواکارییەک لە ڕێزییەکدا: چی بوو، چ مۆدێلێک بوو، چەند تۆکنی هەبوو و چەند تێچووی هەبوو. هیچ پرۆمپت یان وەڵامێک هەڵنابگیرێت، بۆیە هیچەیان ناهێنرێتەوە. ڕیزەکان بۆ ماوەی ٩٠ ڕۆژ دەبێت لە مێژوو، نوێترین لە سەرەوە. کلیلێک کە گەیشتووەتە سنوورەکەی، هێشتا دەتوانێت مێژووەکەی بخوێنێتەوە.

GET https://nymbot.ai/api/v1/queries/history — پێویستی بە کلیلی API هەیە، کە داواکارییەکانی خۆی دەبینێت، یان داواکاری واژەکراو لە ناو ناوی تۆوە، کە هەموو کلیلەکان دەبینێت.

بوارنووسینپێویستەوەسف
pageبەشێک (پرس)نەخێربە دیاریکراوی ١، ل劲ە ١,٠٠٠؛ لاپەڕەیەکی بەرزتر بریتییە لە 400 invalid_value.
page_countبەشێک (پرس)نەخێرڕیز لە هەر لاپەڕەیەکدا. دیاریکراو ٢٠، لە زۆرترین حاڵەتدا ١٠٠.
start_date
end_date
زنجیرە (پرسار)نەخێربەروار یان کاتەکانی ISO 8601.
modelزنجیرە (پرسار)نەخێرتەنها ئەم مۆدێلە.
typeزنجیرە (پرسار)نەخێرchat, responses, messages, image, video, speech, transcription یان embedding.
all_keysبۆلین (پرس)نەخێربە کلیلێک: true هەموو کلیلی هەر ناوێکی هاوشێوە دەگرێتەوە. Default 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 ناگرنەوە. ئەوان واژۆیەکی (signature) لە nymەکەت وەردەگرن، بۆیە کلیلێک کە ڕ泄漏 بوێت دەتوانێت تا سنووری خۆی خەرجی بکات، بەڵام هەرگیز ناتوانێت کلیلێکی تر دروست بکات یان سنووری خۆی بەرز بکاتەوە.

ئەپەکە ئەمە بۆ تۆ دەکات: هەموو شتێک لە شوێنی خۆیدا API ڕیزبەندییەکە ئەم کۆتاییە (endpoints) بەکاردێنێت. تەنها پێویستت بەم بەشە هەیە بۆ بەڕێوەبردنی کلیلەکان لە کۆدی خۆتەوە.

واژەکە ڕووداوێکی Nostrە لە جۆری ٢٧٢٣٥ (NIP-98)، کە بە شێوەی base64-encoded نێردراوە لە 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) تەواوی داواکارییەکە، بە لەقوتکردنی (query string) پێوەوە، ڕێک وەک ئەوەیە کە ناردووە.
  • method میتۆدی HTTPـە.
  • payload ئایا SHA-256ی جەستەی داواکارییە خاوەکە، بە شێوەی hex. پێویستە لەسەر POST و PATCH، و ئەو ناوەڕۆکەی دەیەنێریت دەبێت بە بایتی بۆ بایتی هەمان ئەو ناوەڕۆکەیە بێت کە هاشی کردووتە.
  • created_at دەبێت لە چواراندازی ٦٠ چرکەی کاتژمێری سێرڤەرەکەدا بێت.
  • هەر ڕووداوێک جارێک کار دەکات، a GET تێکهەڵتاوە، بۆ ئەوەی سەرەتاکەی وەرگیراو نەتوانێت دووبارە بەکاربهێنرێتەوە. بۆ هەر داواکارییەک سەرەتایەکی نوێ واژۆ بکە. زیادکردنی nonce تاگێک بە بەهایەکی هەڕەمەکی لەبەر ئەوەی دوو داواکاری کە لە هەمان چرکەدا واژۆ کرابن، هێشتا جیاواز بن.
  • ناوەرۆکی داواکارییەکی واژۆکراوە دەکرێت لە زۆرترین حاڵەتدا ٦٤ کیلۆبایت بێت، و پێویستی بە ناوەڕۆک هەیە Content-Type: application/json.

ڕووداوێکی ون کراو دەگەڕێتەوە 401 missing_nostr_auth; ئەوەی کە هەڵە لە پێکهاتەدایە، واژۆکردنی هەڵەیە، زۆر کۆنە، یان بۆ URL، ڕێگەیەک یان جەستەیەکی جیاوازە، دەگەڕێنێتەوە invalid_nostr_auth، لەگەڵ هۆکارەکە لە نامەکەدا؛ یەکێکی دووبارەکراوەوە دەگەڕێتەوە nostr_auth_replayedکلیلێکی API کە بۆ ئەم کۆتاییەکان (endpoints) بنێردرێت ڕەتدەکرێتەوە. واژۆکەکە پێش خوێندنەوەی ناوەڕۆکەکە (body) وردبینی دەکرێت، و هەر ناونیشانێک دەتوانێت لە خولەکێکدا ٣٠ جار شکستی تێدا بچێت (ناونیشانی IPv6 وەک تەواوی /64 دەژمێرێت)؛ دوای ئەوە دەگاتە 429 لەگەڵ Retry-After.

گەڕاوەکان تەنها دەتوانن ئەم کۆتاییە (endpoints) لە ڕێگەی سایتەکانی خۆیەوە لە Nymbotەوە بانگ بکەن (https://nymbot.ai, https://nymchat.app و ژێرەوەیەکانیان). لاپەڕەیەک لە هەر ماڵپەڕێکی دیکەدا هیچ سەردەن (headers) CORS وەردەگرێتەوە، بۆیە ناتوانێت ئەوە بخوێنێتەوە کە ئەوان دەگەڕێننەوە. سکرێپتەکان و ئەپڵیکەیشنە ڕەسەنەکان، کە هیچ ناردنی... Origin، کاریگەر نییە.

کلیلە نهێنییەکەت

واژەکردن پێویستی بە کلیلە نهێنییەکەی nymەکەت هەیە (the nsec), کە کۆنترۆڵی هەموو شتێک دەکات: ناسنامەکەت، مێژوویەکەت و باڵانسەکەت. تەنها لەناو سکریپتێکدا دایبنێ لە ئامێرێکدا کە متمانەت پێیەتی، لە ڕێگەی ژینگەوە (environment) بیخوێنەرەوە لەبری ئەوەی لەناو فایلەکەدا بنووسیت، و کاتێک دەتوانیت ئەپەکە بەکاربهێنە.

ئەم هاوکارانە سەر (header) دروست دەکەن. نموونەکانی دواتر لەم لاپەڕەیەدا بەکاسیان دەهێنێت. ئەوان کلیلە نهێنییەکە بە شێوەی هێکس (hex) دەخوێننەوە لە NOSTR_SECRET_HEX; ئەوەی cURL بەکاردێنێت بەکاردێنێت نەک ئەداەیەک لە ڕێگەی هێڵەکۆماند (command-line tool)، کە کلیلێکی nsec یان hex وەردەگرێت، و sha256sum (لەسەر macOS، shasum -a 256).

cURL

nostr_auth() {
  method="$1"; url="$2"; body="$3"
  nonce=$(openssl rand -hex 16)
  if [ -n "$body" ]; then
    hash=$(printf '%s' "$body" | sha256sum | cut -d' ' -f1)
    event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce" -t "payload=$hash")
  else
    event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce")
  fi
  printf 'Nostr %s' "$(printf '%s' "$event" | base64 | tr -d '\n')"
}

Python

# pip install coincurve requests
import base64, hashlib, json, os, time
from coincurve import PrivateKey, PublicKeyXOnly

SECRET = bytes.fromhex(os.environ["NOSTR_SECRET_HEX"])

def nostr_auth(method, url, body=b""):
    pubkey = PublicKeyXOnly.from_secret(SECRET).format().hex()
    tags = [["u", url], ["method", method], ["nonce", os.urandom(16).hex()]]
    if body:
        tags.append(["payload", hashlib.sha256(body).hexdigest()])
    created_at = int(time.time())
    serialized = json.dumps([0, pubkey, created_at, 27235, tags, ""], separators=(",", ":"), ensure_ascii=False)
    event_id = hashlib.sha256(serialized.encode()).digest()
    event = {
        "id": event_id.hex(),
        "pubkey": pubkey,
        "created_at": created_at,
        "kind": 27235,
        "tags": tags,
        "content": "",
        "sig": PrivateKey(SECRET).sign_schnorr(event_id).hex(),
    }
    return "Nostr " + base64.b64encode(json.dumps(event).encode()).decode()

JavaScript

// npm install nostr-tools
import { createHash, randomBytes } from "node:crypto";
import { finalizeEvent } from "nostr-tools/pure";

const secret = Buffer.from(process.env.NOSTR_SECRET_HEX, "hex");

export function nostrAuth(method, url, body = "") {
  const tags = [["u", url], ["method", method], ["nonce", randomBytes(16).toString("hex")]];
  if (body) tags.push(["payload", createHash("sha256").update(body).digest("hex")]);
  const event = finalizeEvent(
    { kind: 27235, created_at: Math.floor(Date.now() / 1000), tags, content: "" },
    secret,
  );
  return "Nostr " + Buffer.from(JSON.stringify(event)).toString("base64");
}

کورتەی ئەکاونتەکە

چی لە سەرەوەی لاپەڕەی API ئەپەکە دەردەکەوێت: کلیلە گشتییەکەت، هەردوو هاوسەنگ (balance)، چەند کلیلێک چالاکن (نەک هەڵوەشاوە یان بەسەرچوو)، و زیادکردنی ئۆتۆماتیکی بارکردن ڕێکخستنەکان، یان 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());

بەڕێوەبردنی کلیلەکان

کۆتاییەکان (endpoints) لە پشت لیستی کلیلەکانی ئەپەکە. هەموویان پێویستیان بە واژەکراو داواکاری. هەموو کلیلێک بەم شێوەیە دەگەڕێنەوە، لەگەڵ کاتەکان بە ISO 8601 و بڕەکان بە sats:

تەنیشتی سەرەکی

{
  "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بۆلین (پرس)نەخێرکلیلە هەڵوەشاوەکان بکە ناوەوە. Default 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گیر</li>بەڵێ١ بۆ ٤٠ خانە، جیاواز لە کلیلە چالاکەکانی ترت (بەپێچەوانەبوونەوەی پیتی گەورە و بچووک).
limit_satsبەشگێڕ (integer)نەخێرسنووری خەرجکردن بە ساتس، بە کەم ١. بۆ ئەوەی هیچ سنوورێک نەبێت، بەتاڵ دایبنێ.
reset_periodگیر</li>نەخێرdaily, weekly یان monthlyپێویستییەکان limit_satsبۆ کڵاوێک کە هەرگیز نوێ ناکرێتەوە، وای بێ ئەوە لە دەست بدە.
expire_atسترینگ یان ژمارە (integer)نەخێرکاتێک کلیلەکە کار ناکات: کاتێکی ISO 8601، یان میلی 초دانە لە ساڵی ١٩٧٠وە.

وەڵام (٢٠١)

{
  "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); سنوورێک کە ژمارەیەکی تەواو نییە و لانی کەم ١ بێت؛ ماوەی ڕیزبەندییەک (reset period) بەبێ سنوور؛ expiration (بە تەواوی ڕۆیشتوو)؛ کێڵگەیەکی نەناسراو (unknown_parameter); یان ٢٥ کلیل چالاککراو پێشتر (too_many_keys).
429زیاتر لە ٦٠ کلیل لەلایەن ئەم nymـەوە دروستکراوە، یان ١٢٠ دانە لەم ناونیشانە، لە یەک کاتژمێردا (rate_limit_exceeded، لەگەڵ Retry-After).

cURL

URL=https://nymbot.ai/api/v1/keys
BODY='{"name":"laptop scripts","limit_sats":20000,"reset_period":"monthly"}'
curl "$URL" \
  -H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Python

import json
import requests

url = "https://nymbot.ai/api/v1/keys"
body = json.dumps({"name": "laptop scripts", "limit_sats": 20000, "reset_period": "monthly"}).encode()
res = requests.post(
    url,
    data=body,
    headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"]["key"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys";
const body = JSON.stringify({ name: "laptop scripts", limit_sats: 20000, reset_period: "monthly" });
const res = await fetch(url, {
  method: "POST",
  headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
  body,
});
console.log((await res.json()).data.key);

خوێندنەوەی یەک کلیل

GET https://nymbot.ai/api/v1/keys/{id} — واژەکراوە.

گەڕانەکان {"data": {…}} بە ئۆبجێکتەکەی کلیلییەوە، یان 404 key_not_found ئەگەر هیچ کلیلێکی تۆ ئەو ناسنامەیە نەبێت.

cURL

URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
console.log((await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json()).data);

گۆڕینی کلیلێک

PATCH https://nymbot.ai/api/v1/keys/{id} — واژەکراوە.

هەر کامێکیان بنێرە name, limit_sats, reset_period و expire_at، بە هەمان یاساکان وەک کاتێک کلیل دروست دەکرێت. null کەشی: سنوور نییە، ڕیست نییە، بەسەرچوون نییە. گۆڕینی ماوەی ڕیستکردن، ماوەیەکی نوێ لە سفرەوە دەست پێ دەکات. کلیلێکی هەڵوەشاوە ناگۆڕدرێت (400 key_revoked). دەگەڕێنێتەوە {"data": {…}} لەگەڵ ئۆبجێکت کلیلەکە نوێکراوەکە.

cURL

URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
BODY='{"limit_sats":50000,"expire_at":null}'
curl -X PATCH "$URL" \
  -H "Authorization: $(nostr_auth PATCH "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Python

import json
import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
body = json.dumps({"limit_sats": 50000, "expire_at": None}).encode()
res = requests.patch(
    url,
    data=body,
    headers={"Authorization": nostr_auth("PATCH", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const body = JSON.stringify({ limit_sats: 50000, expire_at: null });
const res = await fetch(url, {
  method: "PATCH",
  headers: { "Authorization": nostrAuth("PATCH", url, body), "Content-Type": "application/json" },
  body,
});
console.log((await res.json()).data);

هەڵوەشاندنەوەی کلیلێک

DELETE https://nymbot.ai/api/v1/keys/{id} — واژەکراوە.

کلیلەکە دەستبەجێ ڕادەگرێت، بۆ هەمیشە. لە لیستەکەدا دەمێنێتەوە لەگەڵ revoked_at دانراوە، و دەتوانرێت ببینرێت لەگەڵ include_revoked=trueڕەگەزدارکردنەوەی کلیلێک کە پێشتر ڕەگەزدار کراوە، هەمان وەڵام دەداتەوە. تەنها نوێترین ٥٠ کلیل ڕەگەزدارکراو دەپارێزرێن؛ کۆنترەکانیان دەسڕێنەوە کاتێک کلیلێکی تر ڕەگەزدار دەکرێت.

وەڵام

{ "data": { "id": "4f0c9a1be27d3856", "revoked": true } }

cURL

URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());

کردنەوەی خۆکارانەی پرکردنەوەی NWC

جزدانێکی Lightning بە Nostr Wallet Connect ببەستەوە و کاتێک خەرجی API باڵانسەکە کەم دەکاتەوە، Nymbot خۆی باڵانسەکە پڕ دەکاتەوە. لیستی APIی ئەپەکە هەمان ڕێکخستنەکانی هەیە؛ ئەمانە ئەو endpoint-انەن کە لە پشتەوەیانە. هەموویان پێویستیان بە... داواکاری واژەکراو.

چۆن کار دەکات: دوای ئەوەی تێچووی داواکارییەکی API لەو باڵانسەی هەڵبژاردووتە بۆ بینین لێ دەخرێت، ئەگەر ئەو باڵانسە لە سنووری دیاریکراوت کەمتر بوو، Nymbot فاکتۆرێک بۆ بڕی پرکردنەوەکەت دروست دەکات، داوای وەڵامدانەوە لە وۆڵێتەکەت دەکات و کرێیەکە زیاد دەکات. زۆرترین جار لە هەر ٥ خولەکێکدا بۆ هەر nym و باڵانسێک پرکردنەوە ئەنجام دەدات، بۆ ئەوەی ڕەوانی داواکارییەکان نەتوانێت وۆڵێتەکە بە تەواوی بەتاڵ بکاتەوە. خەرجکردن لە ناو ئەپەکاندا کار ناکات بۆ ئەم پرۆسەیە. کات و قەبارەی دوایین پرکردنەوە، و دوایین هەڵە، لە ڕێکخستنەکاندان (settings) دەبینرێن؛ ئەگەر پارەدانێک دوای هەڵەیەک سەرکەوتوو بووبێت، پشکنینی فاکتۆرەکەی لەگەڵ بارودۆخی پر充کردنەکە بەخشینەکە بۆ ئەوەیە.

پێش ئەوەی بەڕاستی وۆڵێتێک (wallet) ببەستیتەوە

بەستری پەیوەندی (connection string) ڕێگە دەدات بە هەر کەسێک کە خاوەنی بێت داوا بکات لە جزدانەکەتەوە پارە بدات. Nymbot ئەو بە شێوەیە کۆگای دەکات کە بە کۆدکراو (encrypted) بێت و تەنها بۆ دانەوەی پسوولەکانی پرکردنەوەی خۆی بەکاری دەهێنێت، بەڵام بەستنێکی تایبەت بۆ ئەم کارە دروست بکە، بە بودجەیەکی دیاریکراوی خەرجکردن لە جزدانەکەتدا، بەوەndەی زۆرترین بڕی پارەی بتوانێت بدات تەنها ئەو ژمارەیە بێت کە تۆ هەڵبژاردووە. جەوانەکە دەبێت پشتگیری بکات pay_invoice.

بەستنەوەی بەختەوەری (wallet)

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — واژەکراوە.

بوارنووسینپێویستەوەسف
nwc_urlگیر</li>بەڵێبەستەرە دەقەکە، دەستپێکردن nostr+walletconnect://. Nymbot داوا لە وۆڵێتەکە دەکات بۆ get_info پێش پاشەکەوتکردنی، و بە شێوەی کۆدکراو دەپارێزێت.
threshold_satsبەشگێڕ (integer)بەڵێکە هاوسەنگی کەمتر لەم ژمارە سەتسە خوارەوە چوو، پڕی بکەوە. لانی کەم ١,٠٠٠.
topup_satsبەشگێڕ (integer)بەڵێبڕی هەر جارێک چەند زیاد بکەم. ١,٠٠٠ بۆ ١,٠٠٠,٠٠٠ ساتۆشی.
tierگیر</li>نەخێر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بە پەیوەندییەک (connection string) نییە (invalid_nwc_url); جزدانەکە لە ڕێگەی ڕێگەی گواستنەوەی خۆیەوە وەڵامی نەدایەوە (nwc_unreachable) یان پشکنینەکە ڕەتکردەوە (nwc_rejected); پەیوەندییەکە ناتوانێت پسوولەکان بدات (nwc_missing_permission); یان بڕێک لە دەرەوەی سنوورەکان.
501ناوکردنەوەی خۆکار بۆ ئەم سێرڤەرە کار ناکات (nwc_unavailable). هەمان شت بۆ ئەو دوو کۆتاییە (endpoints) دیکەش true دەبێت.

cURL

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

Python

import json, os
import requests

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

JavaScript

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

خوێندنەوەی ڕێکخستنەکان

GET https://nymbot.ai/api/v1/nwc-auto-topup — واژەکراوە.

هەمان ئۆبجێکت دەگەڕێنێتەوە وەک پەیوەستکردن، لەگەڵ connected: false و بوارەکانی دیکە null کاتێک هیچ پارەدانێک (wallet) بەستراوەتەوە. خودی دەقەکە بەستنەوەییەکە (connection string) هەرگیز ن戻ێxrێتەوە.

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 — واژەکراوە.

سترینگی پەیوەندی کۆکراوە دەسڕێتەوە. هیچ زانیارییەکی زیادکردنی بودجە (top-up) ئەنجام دەدرێتەوە. بۆ دڵنیابوونەوە، دەتوانیت پەیوەندییەکە لە ناو بەحەشتەکەتدا (wallet) هەڵبوەشێنیتەوە.

وەڵام

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

بەپێی داواکاری پارە دەنیشێریت بەبێ کلیل

خاڵە کۆتاییەkirawە نرخە جێگیرەکان دەکرێت لە ڕێگەی Lightningیەوە بۆ هەر داواکارییەک لە کاتێکدا بی paid بکرێت، بە بێ کلیل، بە بێ ئەکاونت و بە بێ باڵانس: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations و POST /embeddingsچات، وەڵامەکان و نامەکان هەمیشە پێویستیان بە کلیلێک هەیە. ئەو داواکارییەی کە کلیلێکی لەگەڵە، وەک ئاسایی لە هاوسەنگکەرەکە (balance) خەرجی دەکرێت؛ پرۆسەی پارەدان تەنها دەست پێ دەکات کاتێک هیچ کلیلێک نەنێردرێت.

Nymbot دوو وەشانی هەمان بیرۆکە دەڵێتەوە، لە یەک باکئێندەوە: Lightning Labs' L402 (هەروەها بە ناوی کۆنییەوە وەرگیراوە، LSAT) و ڕەشنووسی IETF پارەدان ڕێکخستنەوەی ناسینەوەی HTTP لەگەڵ lightning ڕێگەی و charge مەبەست. هەر دانەیەک کە کڕیارەکەت لێی تێدەگات بەکاربهێنە.

ڕاگرتنی سێرڤەری خۆت

پارەدان بەبێ کلیل تەنها کاتێک کارا دەبێت کە API_L402_SECRET کەمتر نییە لە ٣٢ بایتی هەڕەمەکی هەڵدەگرێت، وەک هێکس (٦٤ کاراکتەر) یان base64 (٤٤). یەکێکیان دروست بکە بە... openssl rand -hex 32بەهایەکی کورتتر یان ئەوەی دەتوانرێت پێشبینی بکرێت تایبەتمەندییەکە دادەخات و هۆکارەکە تۆمار دەکات. بۆ گۆڕینی، بەهایە کۆنەکە منتقل بکە بۆ API_L402_SECRET_PREVIOUS بۆ ماوەی ڕۆژێک: ناسنامەکان (credentials)، لینکەکانی دۆخ (status URLs) و ئەو تەحەدییانەی لەژێرەوە دروستکراون کار دەکەن تا ئەو کاتەی بەسەردهێن.

چالاکییەکە

داواکارییەکە بنێرە بەبێ هیچ Authorization سەرەوە. ئەگەر دروست بێت، هیچ شتێک ڕانەدەبێت، و دەستت دەکەوێت 402 Payment Required بە پسوولەیەک بۆ ڕێک ئەو شتەی داواکراوە تێچووی دەدات: هەمان نرخێک کە کلیلەکە دەیدات، بە گۆڕینی بە ١٠ سات بۆ هەر کرێدیتێکی ئاسایی یان ١٠٠ سات بۆ هەر کرێدیتێکی Pro و ڕێکخراوە بۆ ساتێکی تەواو (لانی کەم ١ سات، و لانی کەم کەمترین ڕادەی ٠.٠٥ کرێدیت). وەڵامەکە سێ دانەیە 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 پەرەمتەر base64url JSONـە: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

گۆڕانکارییەک بەستراوەتەوە بە کۆتاییگەیەوە، بۆ Content-Type (جۆری میدیایەکەی و، بۆ multipart، سنووری سنوورکردنی (boundary)ەکەی) و بۆ SHA-256ی ڕێک ئەو باوەتەی کە ناردووتە، و ١٥ دقێقە دەخایەنێت. دوای پارەدان، ئەوە بنێرە یەکگرتوو دووبارە داواکاری بکە: هەمان شت Content-Type و هەمان بایتی JSON، یان بۆ ئەندپۆینتەکانی multipart (/images/edits, /audio/transcriptions, /audio/translations) هەمان جەستەی چەندین بەش (multipart body) بە هەمان سنووردارکەرەوە (boundary). زۆربەی کتێبخانەکانی HTTP سنووردارکەرەوەیەکی نوێ هەڵدەبژێرن هەر جارێک کە فۆرمێک کۆد دەکەنەوە، بۆیە جارێک کۆدی بکە و ئەو بایتانە دوو جار بنێرە.

هەر ناونیشانێک دەتوانێت لە هەر خولەکێکدا ٣٠ تەحەدی داوا بکات (ناونیشانی IPv6 وەک تەواوی /64 دەژمرێت). ئەو داواکارییانەی ناونیشانیان نەزانراوە، ١٠ دانە لە هەر خولەکێکدا بە شێوەیەکی توندتر بە هاوبەشی بەکاردێنن، و سنوورێکی گشتی لەسەر ئەو تەحەدییانەیە کە Nymbot لە هەموو ناونیشانەکانەوە دەدات؛ داواکارییەک کە پێش ئەوەی تەحەدییەک بکرێت ڕەت دەکرێتەوە (بۆ نموونە بەهۆی ئەوەی ناوەڕۆکەکەی JSONی دروست نییە) هەژمار ناکرێت بۆ ئەوە. جگە لەوەش، وەڵامەکە بریتییە لە 429 لەگەڵ Retry-After، پێش ئەوەی ناوەرۆکەکە بخوێندرێت ناردراوە. ئەو خاڵانەی (endpoints) کە بەبێ کلیل یان ناسنامە بانگ دەکرێن، هەروەها هەژمار دەکرێن بۆ سنووری گشتی ١٢٠ داواکاریی نەناسراو لە خولەکێکدا بۆ هەر ناونیشانێک. ناسنامە پێش ئەوەی ناوەرۆکەکە بخوێندرێت پشکنین بۆ دەکرێت، و داواکارییەک کە Content-Type نییە application/json (یان multipart/form-data بۆ ئەپلۆدکردن) بە ڕەتکرانەوە دەردەکەوێت لەگەڵ 415 و هەرگیز فاتوێری بۆ نێریت.

نرخی ئیمبیدینگەکان (Embeddings) لەسەر بنەمای خەمڵاندنی توکنەکانی ناوەڕۆکی دەرەنجام (input) دیاری دەکرێت، بە margins 1.5&times;، لەبەر ئەوەی ژمارەی ڕاستەقینە تەنها دوای ئەوە دەزانرێت. تۆ پارەی ئەو توکانە دەدەی کە بە ڕاستی بەکارهاتوون، و بەشی بەکارنەهێنراوی پارەکە وەک... دەگەڕێتەوە گەڕاندنەوەی تۆکن.

ناردنی پارەکە

وەتی بە ئەلیکترۆنییەک (invoice) بە هەر جۆرە والییەتییەکی Lightning (Lightning wallet) بییە. والیێتەکە precondition (preimage) دەداتێ، کە ٦٤ کارەکتەری hexـە. دوای ئەوە هەمان داواکاری بنێرەوە بە یەکێک لە ئەمانە:

پلانسەرناو
L402Authorization: L402 <macaroon>:<preimage> (LSAT کار دەکاتەوە)
پارەدانAuthorization: Payment <base64url JSON>، کە JSONەکە لێیە {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

داوا nymbot ئۆبجێکتەکە هیچ بوارێکی هاوسەنگی (balance) نییە: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}, و هیچ ... نییە X-Nymbot-Balance-Sats سەرەوە. A داواکارییەک کە بە ڕێگەی پارەدانەکەوە دراوابێت، دەستی پێدەکات بە Payment-Receipt سەرپێ (base64url JSON لەگەڵ ناسنامەی تەحەددی، هاشەکەی پارەکە وەک reference, status و timestamp). داواکارییە پارەدانکراوەکان بە هیچ ناویەک (nym) بەستراوەتەوە، بۆیە لە مێژووی پرسیارەکاندا دەردەکەون.

بارودۆخکەی
402 payment_already_usedهەموو پارەدانێک تێچووی یەک داواکارییە. وەڵامەکە تەحەددییەکی نوێیە بۆ ئەم داواکارییە، بۆیە ئەو کڕیارەی کە دوایین ناسنامەی خۆی کۆگای دەکات (وەک lnget بە سادەیی دووبارە دەداتەوە.
402 payment_mismatchبڕوانامەکە بۆ خاڵی کۆتایی (endpoint)ێکی تر دەربخرابوو، Content-Type یان جەستە، یان کەمتر لەوە دەدات کە ئێستا تێچووی ئەم داواکارییە هەیە. تەحەدിയەیەکی نوێ بۆ ئەم داواکارییە لەگەڵیدایە؛ ئەگەر پارەکە زۆر کەم بووایە، ئەوەی پێی شتی دەگەڕێتەوە وەک... گەڕاندنەوەی تۆکن (refund_token و refund_sats لە جەستەدا).
402 payment_expiredزیاتر لە ١٥ خولەک بەسەر تەحەدییەکەدا تێپەڕی. تەحەدییەکی نوێ لەگەڵیدا دێت. ئەگەر وێنەی پێشوەختە (preimage) نیشانی بدات کە تۆ پارەت داناوە، ئەوەی دراوەتەوە وەک ... دەگەڕێتەوە گەڕاندنەوەی تۆکن (refund_token و refund_sats لە ناو جەستەدا)، جارێک؛ پاشان ناسنامەکە بەکار دەهێنرێت و بەسەرێ دێت.
401 invalid_preimageپێش-وێنەکە هاش ناکات بۆ هاشی پارەدانەکەی پسوولەکە. پارەدانەکە بەکار ناهێنراوە.
401 invalid_payment_credentialبڕوانامەکە هەڵەیە، یان دوای ئەوەی Nymbot دەرستی کردووە گۆڕاوە، یان ئاماژە بە هێڵەکی (hash) پارەدانێک دەکات کە Nymbot هەر وەسڵێکی بۆ دەرنەکردووە. مەکارۆنێک (macaroon) کە ڕەهەندێکی (caveat) تێدابێت کە Nymbot نەیداناسێت، یان ڕەهەندی پێداچوونەوەی تێدابێت، ڕەت دەکرێتەوە.
429 rate_limit_exceededزیاتر لە ٣٠ ناسنامە یان کلیل کە لە دەکۆڵینەوەدا سەرکەوتوو نەبوون لەم ناونیشانەوە هات لە خولەکێکدا، یان یەک تۆکەنی گەڕانەوە زیاتر لە ٦٠ جار لە خولەکێکدا ناردراوە. چاوەڕێ بکە بۆ 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 بە ڕێگەی Lightning کار لە تەحەدای پارەدانەکە بکەن؛ ئاراستەی کۆتاییەکەیان (endpoint) بکەن و ڕێگەیان بدەن پارە بدەن.

ڤیدیۆکان

پارەدراو POST /videos وەڵامەکان 202 وەک ئەوەی کلیلکراو بێت، لەگەڵ a status_url: GET بەبێ هیچ کلیلێک بۆ بەدواداچوون بۆ کارەکە. وا ئیمزا کراوە و بۆ ماوەی ٢٤ کاتژمێر کار دەکات، تا ئەو کاتەی کارەکە پارێزراو دەبێت.

{
  "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"); ئەگەر ڕێندەرەکە بەبێ پارە شکست بخوات، پارەکە دەچێتە سەر ئەوە. URL ی بارودۆخەکە نیشان دەدات refund_sats بۆ کارێک کە پارەکەی گەڕێنراوەوە بەڵام هەرگیز تۆکنەکەی نەدراوە، بۆیە هاوبەشکردنی لینکەکە (URL) دۆخی گەڕاندنەوەکە هاوبەش ناکات. پشکنینی تۆکنەکە هەروەها کارێکی سەرکەوتێنەراوە کە کەسیش پرسیار (poll) نەکردووە، ڕێکدەخات.

گەڕانەوەی پارە

ئەگەر داواکارییەکی پارەدار شکست هەڵدات و دابینکەر پارەی ئەو هەوڵە لە Nymbot گرت، پارەکە دەبێتە خۆیان و هەڵەکە ئاماژە بەوە دەکات، لەگەڵ 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 ئەو ئۆبجێکتە تۆکەنێکی گەڕانەوەی بۆ ئەو بەشیye کە نەبووە؛ دەقی وەرگێڕانێک کە نەدەتوانرا درێژییەکەی لە سەرەتادا بخوێندرێتەوە، بەپێی درێژترین ئەگەر کە فایلەکە دەتوانێت بێت نرخ دەستنیشان دەکرێت (هەرگیز زیاتر لە ٣٠ خولەک)، و جیاوازییەکە لەگەڵ درێژییە ڕاستەکەوە وەک تۆکەنێکی گەڕانەوە دەگەڕێتەوە؛ ئەگەر دەرکەوت درێژ hơnە لە ٣٠ خولەک، بەم ڕەزامەند نەبوونەوە وەرناگیرێت 413 و هەموو پارەکە دەگەڕێتەوە. Embeddings ئەو شتانە دەگەڕێننەوە کە خەمڵاندەکە ڕاگرتبوو. ڤیدیۆیەکی شکستی هێناوە دەگەڕێتەوە بۆ ئەو تۆکەنەی کە ناردنی گەڕاندەوە.

تۆکنی گەڕاندنەوە کۆدێکی ٢٥٦-بیتە و هەڕەمەکییە. Nymbot تەنها هاشەکەی هەڵدەگرێت، و دوای ٣٠ ڕۆژ بەسەردهێت. باڵانسی sat هەڵدەگری، و دەتوانیت:

  • بەو پارە بدە. بنێرە Authorization: Bearer REFUND-… لە هەر یەک لە ئەو کۆتاییە سەرەوەیانە (OpenAI SDK وەک کلیلێکی API وەری دەگرێت). نرخەکە لە تۆکنەکە دەڕوات و ئەوەی دەمێنێتەوە لەسەر دەمێنێت (refund_token_sats لە ناو nymbot کەشی). تۆکەنێک کە نرخی لە داواکاری کەمترە وەڵام دەداتەوە 402 refund_insufficient; شکستێکی نەنووسراوە (unbilled) ساتەکان دەگەڕێنێتەوە سەر هەمان تۆکن.
  • پێداچوونەوەی بۆ بکە GET /api/v1/l402/refunds بە هەمان سەردێڕ دەگەڕێنێتەوە {"sats": 237, "status": "open", "expires_at": "..."}.
  • یەک تۆکەن دەتوانرێت بە زۆرترین ٦٠ جار لە خولەکێکدا بەکاربهێنرێت.
  • بگوازەرەوە بۆ ناو ناوی ڕاستەقینە. بیخە ناو دیارییەک بخە بەکارەوە لە ئەپڵیکەیشنی Nymbot، یان پەیوەندی بکە POST /api/v1/l402/refunds/redeem بە یەک داواکاری واژەکراو و {"refund_token": "REFUND-...", "balance": "standard"} (یان "pro"). هەموو کرێدیتەکان دەچنە سەر باڵانسەکە (١٠ سات بۆ هەر یەک لە standard، ١٠٠ سات بۆ Pro)؛ ئەو ساتانەی کە کرێدیتێکی تەواو دروست ناکەن لەسەر تۆکەنەکە دەمێننەوە بۆ داواکارییەکانی 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 } }