منځپانګې ته لاړ شئ
د Nymbot په اړه

د پوهې بنسټ پراختیا

توازن، top-ups او کلیدونه

چمتو کړئ چې تاسو څه لري، د رڼا په پرتله، په اتوماتيک ډول ستاسو د ګمرک څخه، وګورئ چې هر غوښتنلیک څه ارزښت لري، او د کوډ څخه د کلیدونو مدیریت.

د توازن څارنه

ستاسو د توازنونو، او د دې کلید د کڅوړې مقدار کارول کیږي.

GET https://nymbot.ai/api/v1/credits/balance - د API کلید ته اړتیا لري. POST هم کار کوي، د مشتریانو لپاره چې دا انتظار کوي.

balance د دوو توازنونه په ډالرو کې د اوسني Bitcoin نرخ په ګډه دي، د وسایلو لپاره چې یو واحد شمیره انتظار کوي (null که قیمت نه ښيي). د بډایه په کریډیټونو او sats کې دی، کوم چې په حقیقت کې د توازنونو په څیر ساتل کیږي. key کولی شي د کلید چې پوښتنه ورکوي. یو کلید چې د دې کچه ته ورسیږي، کولی شي د توازن چیک کړي.

ځواب

{
  "balance": 49.18,
  "balance_sats": 42037,
  "standard": { "credits": 120.4, "sats": 1204 },
  "pro": { "credits": 408.33, "sats": 40833 },
  "key": {
    "id": "4f0c9a1be27d3856",
    "name": "laptop scripts",
    "limit_sats": 20000,
    "period_used_sats": 3412,
    "total_used_sats": 18230,
    "reset_period": "monthly",
    "reset_at": "2026-10-01T00:00:00Z"
  }
}
د شرایطوکله چې
401د کلید په لټه کې دی، ناشناخته، لګول یا ختم شوی.

cURL

curl https://nymbot.ai/api/v1/credits/balance \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os
import requests

res = requests.get(
    "https://nymbot.ai/api/v1/credits/balance",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
)
balance = res.json()
print(balance["standard"]["sats"], balance["pro"]["sats"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/credits/balance", {
  headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
const balance = await res.json();
console.log(balance.standard.sats, balance.pro.sats);

د پیسو طریقې

چیرته چې تاسو کولی شئ، او د محدودیتونه. د رڼا د واحد طریقې ده.

GET https://nymbot.ai/api/v1/topup/payment-methods د کلیدي اړتیا نلري.

یو top-up ده 10 څخه تر 1،000،000 sats؛ یو پرو top-up باید لږ تر لږه یو پرو کریډیټ خوندي شي، نو دا د 100 sats څخه پیل کیږي. د ډالرو محدودیتونه د بیتکوین بیه پیژندل کیږي. 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);

د رڼا په اړه

د رڼا حساب ورکوي چې د کریډیټ اضافه کوي چې د کلید لري. دا له هر رڼا کڅوړه څخه ورکوي، نو چمتو کړئ د کریډیټ اضافه کولو لپاره.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning - د API کلید ته اړتیا لري.

ځمکهډولاړتياد نمونې
amountشمیرههوڅومره، په currency. د sats لپاره ټول شمېر.
currencyد StringنهSATS (د فورمه په اړه) USD یا BTCډالرو په اوسني Bitcoin بيه کې بدل کیږي.
tierد Stringنهpro (د default) یا standard: چې د کریډیټ توازن ته راځي.

د معياري کریډیټ ده 10 sats او د پرو کریډیټ 100 sats، او د هر بل بونس؛ credits دا بیان کوي چې دا حسابونه به اضافه کړي.

ځواب

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
د شرایطوکله چې
400نور لاره په لاره کې (unsupported_method) د ناشایسته ارزښت (unsupported_currency) یا ټیټ، د کمیت مقدار، یا لږ تر لږه مقدار (amount_too_small) د 1،000 ټوټه څخه زیات (amount_too_large) یا د Lightning کڅوړه (amount_out_of_range).
429د 60 څخه زیات حسابونه د دې nimm لپاره، یا 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);

د Top-up چمتو کول

پوښتنه چې آیا د حساب ورکړل شوي دي او، کله چې دا لري، د کریډیټ اضافه کوي. چیک کول دا دی چې دا کریډیټ کوي، نو د پیسو وروسته، چیک کړئ چې د حالت 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د انټرنیټ (Query)نهد معياري 1، تر ټولو 1000؛ د لوړ پاڼه ده 400 invalid_value.
page_countد انټرنیټ (Query)نهد صفحې په اړه رنګونه. د معیاري 20 څخه تر لږه 100 څخه.
start_date
end_date
String (د پوښتنې)نهISO 8601 تاریخونه یا وختونه.
modelString (د پوښتنې)نهیوازې دا ماډل.
typeString (د پوښتنې)نهchat, responses, messages, image, video, speech, transcription یا embedding.
all_keysد پوښونو (Query)نهسره یو کلید: true شامل دي هر د ورته nym. Default کلید false.
key_idString (د پوښتنې)نهسره د امانت د درخواست، او يا سره 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);

د حساب ورکولو غوښتنلیک

د کوکيز جوړولو، بدلولو او بدلولو، د اکاؤنټ خلاص او اتومات Top-ups د API کلید نه لري. دوی ستاسو د نیم څخه د امانت لیږدوي، له دې امله د لیږد شوي کلید کولی شي د خپل کپس ته رسوي، مګر کولی شي هیڅکله یو بل کلید یا خپل خپل کپس لوړ کړي.

د اپلیکیشن ستاسو لپاره دا کار کوي: هر څه په خپل کې د آتشې تاسو یوازې د دې برخه ته اړتيا لري چې ستاسو د خپل کوډ څخه کلیدونه مدیریت کړئ.

د سند د 27235 (NIP-98) ډول Nostr واقعیت دی، چې د base64-کډل شوی دی. 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 د غوښتنلیک بشپړ URL دی، د پوښتنې string شامل دي، دقیقا لکه څنګه چې سپارل شوی.
  • method دا د HTTP لاره ده.
  • payload ده د خام درخواست بدن SHA-256، په هیکس کې. دا ته اړتيا لري POST او PATCH، او هغه بدن چې تاسو ته ورسیږي باید د هغه بټ دی چې تاسو hashed.
  • created_at باید د سرور ساعت څخه د 60 ثانیو په منځ کې وي.
  • هر واقعې یو ځل کار کوي، a GET شامل دي، نو د کټګورۍ مخکښ کولی شي د دوبې لګول نه شي. د هر غوښتنلیک لپاره یو نوي مخکښ کړئ. nonce سره د تصادفي ارزښت tag نو دوه غوښتنلیکونه په ورته ثانیو کې امین شوي هم مختلف دي.
  • د امانت شوي درخواست بدن کولی شي د 64 KB څخه زیات وي، او د بدن اړتیا لري Content-Type: application/json.

د ناڅاپي واقعې راټول کیږي 401 missing_nostr_auth; یو چې په بریالیتوب ډول جوړ شوی، په بریالیتوب توګه امین شوی، ډیر قد، یا د یو بل URL، لاره یا بدن ته ورسیږي. invalid_nostr_auth، په پیغام کې د دلیل سره ، یو دوبله کارول nostr_auth_replayed. د انټرنیټ کلید چې د دې پایپونو ته لیږدول کیږي له لاسه ورکوي. د سند د بدن په لوستلو مخکې چمتو کیږي، او هر آدرس کولی شي په اونۍ کې 30 ځله (د IPv6 پته به په بشپړه توګه /64) په شمول وي؛ وروسته دا ترلاسه کوي 429 سره Retry-After.

براؤزرونه کولی شي د دې پایلې څخه یوازې د Nymbot خپل سایټونو څخه تماس ونیسئ (https://nymbot.ai, https://nymchat.app په هر بل سایټ کې یو پاڼه CORS مخونه نه ترلاسه کوي، نو دا نه کولی شي هغه څه چې دوی ته ورسیږي. سکرپټونه او نایټینټ اپلیکیشنونه، چې نه پیژندل کیږي Originنه غلظت شوي دي.

د خپل راز کلید

د امانت لپاره د خپل نیم راز کلید ته اړتيا لري (د nsec، کوم چې هر څه کنټرول کوي: ستاسو د شناختو، ستاسو د تاریخ او ستاسو د توازن. یوازې دا په یو سکرپټ کې په یو ماشین کې چې تاسو باور لرئ، دا د چاپیریال څخه وګورئ په پرتله دا په فایل کې لیکل کیږي، او د اپلیکیشن ترټولو غوره کړئ کله چې تاسو کولی شئ.

دا مسلکیانو د مخکښ جوړوي. په دې مخ کې د راتلونکي مثالونه دوی کاروي. دوی د مخکښ کلید په هیکس کې یې وګورئ NOSTR_SECRET_HEX; د cURL یو کاروي چې د نان د command-line وسیله، چې د 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 پاڼه په لوړه کې ښيي: ستاسو د عمومي کلید، دوه توازنونه، څومره کلیدونه فعال دي (نه تبادله شوي یا ختم نه شوي)، او اتومات Top-up تنظیمات، او یا 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());

د کلیدي مدیریت

د اپلیکیشن د کلیدي لیست پیژندل. دوی ټول اړتیا لري د درخواست په نامههر کلید په دې فارم کې راځي، په 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د پوښونو (Query)نهشامل شوي کلیدونه. 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د Stringهو1 څخه تر 40 ځانګړتیاوې، ستاسو د نورو فعال کلیدونو څخه توپیر لري (د کورس په لټه کې).
limit_satsانټرنیټنهد سپارلو کچه په sats کې، لږ تر لږه 1. د دې لپاره د کڅوړې پرته.
reset_periodد Stringنهdaily, weekly یا monthlyاړتیاوې limit_sats. د دې لپاره د پوښونو لپاره رخصت کړئ چې هیڅکله نه راټول کیږي.
expire_atstring یا integerنهکله چې کلید کار نه کوي: د ISO 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)؛ د cap نه ده چې لږ تر لږه 1 کلن شمیره ده؛ د reset دوره پرته د cap؛ په راتلونکې کې د ختم کولو؛ د ناشناخته کچه (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 که ستاسو د کلید د دې ID نه لري.

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 د ځمکې د پاکولو: نه cap، نه reset، نه expiration. د reset دوره بدلولو د نوي دوره په لټه کې پیل کوي. د revoked کلید نه بدلول شي. (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 Auto-top-up

د لاټینګ پولټ سره د Nostr Wallet Connect سره اړیکه ونیسئ او Nymbot په خپل ځان کې یو توازن پورته کوي کله چې د API لګښت یې کم کوي. د اپلیکیشن API پاڼه ورته تنظیمات لري؛ دا د دې پیژندنې پایلې دي. دوی ټول اړتیا لري د درخواست په نامه.

څنګه کار کوي: کله چې د API غوښتنلیک د تادیه کولو لپاره د تادیه کولو لپاره ټاکل کیږي، که دا تادیه ستاسو د تادیه څخه نیسي، Nymbot ستاسو د تادیه کولو مقدار لپاره حساب ورکوي، ستاسو د تادیه کولو لپاره پوښتنه کوي، او د کریډیټ اضافه کوي. دا هر 5 دقیقې لپاره د تادیه کولو او تادیه کولو لپاره تر ټولو یو ځل تادیه کیږي، نو د غوښتنلیکونو بڼه کولی شي تادیه کړي. د اپلیکیشنونو کې پیسې دا د فعالولو نه کوي. د وروستیو تادیه کولو او وروستیو غلطۍ وخت او اندازه په ترتیباتو کې دي؛ که د تادیه کولو وروسته د غلطی له لارې چمتو کیږي، د تادیه کولو سره د Top-Up حالت د دې اعتبار.

مخکې چې تاسو د پولادو سره اړیکه ونیسي

د اړیکو ټینګ اجازه ورکوي چې هغه څوک چې دا لري ستاسو د پولادو ته ورکوي. Nymbot دا کوډوي او یوازې هغه کاروي چې د خپل خپل Top-up فورمه ورکوي، مګر یوازې د دې لپاره د اړیکو جوړوي، ستاسو په پولادو کې د سپارښتنې بودجه سره، نو تر ټولو هغه چې دا کولی شي په هر وخت کې ورکوي دا ده چې تاسو غوره کړئ. د پولادو باید د سپارښتنې ملاتړ وکړي pay_invoice.

د کڅوړې سره اړیکه

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect د امانت

ځمکهډولاړتياد نمونې
nwc_urlد Stringهود کنټرول string، پیل nostr+walletconnect://Nymbot د پیسو لپاره پوښتنه کوي get_info مخکې له دې چې د خوندي کولو، او د خوندي کولو.
threshold_satsانټرنیټهوTop up کله چې د توازن د دې ډیری sats نیسي. لږ تر لږه 1000.
topup_satsانټرنیټهوپه هر وخت کې څومره اضافه کړئ. 1000 څخه تر 1،000،000 sats.
tierد Stringنهpro (د default) یا 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په دې سرور کې د اتومات top-ups فعال نه دي (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());

د غوښتنې پرته پرته پرته د کلید

د fixed-price پایپونه کولی شي په هر وخت کې د Lightning په اړه د یو غوښتنلیک لپاره پیسې ورکړي، نه کلید، نه حساب او نه توازن: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations او POST /embeddings. چیټ، ځوابونه او پیغامونه تل د کلید ته اړتيا لري. د غوښتنې چې د کلید لري په معمولي توګه د توازن ته ورسول کیږي؛ د پیسو جریان یوازې کله چې د کلید نه ورسول کیږي پیل کیږي.

Nymbot د يو backend څخه د ورته افکار دوه نسخه خبرې کوي: Lightning Labs' د 402 (د هغې د قدیم نوم لاندې هم قبول شوی، LSAT) او د IETF پروژې د پیسو د HTTP تصدیق سیسټم سره lightning د نمونې او charge په هر ډول ډول کار وکړئ چې ستاسو مشتری درکوي.

د خپل سرور چلولو

د بیلابیلو وړاندیز یوازې کله چې API_L402_SECRET لږ تر لږه 32 لګښت بټونه لري، لکه د هیکس (64 ځانګړنو) یا base64 (44). openssl rand -hex 32. د کوچني یا ګټور ارزښت د ځانګړتیا څخه تړل کیږي او د دې لپاره ریکارډ کوي. د دې لپاره، د قدیم ارزښت ته حرکت وکړئ API_L402_SECRET_PREVIOUS د يو ورځ: د اعتباراتو، حالت URLs، او د دې لاندې ترسره شوي چټکونو د کار کولو پورې کار کوي.

د نندارتون

د غوښتنلیک سره نه Authorization په سر کې. که دا ارزښت لري، هیڅکله کار نه کوي، او تاسو کولی شئ 402 Payment Required د دې غوښتنلیک لګښتونو لپاره د فایبر سره: ورته قیمت چې یو کلید به ورکړي، په 10٪ کې د معياري کریډیټ یا 100٪ کې د پرو کریډیټ بدل کیږي او په بشپړ ډول (د لږ تر لږه 1٪ کې، او لږ تر لږه 0.05٪ کې د کریډیټ لږ تر لږه) راټول کیږي. WWW-Authenticate د ورته حساب لپاره د ستونزو:

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

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

د پیسو request پارامتر base64url JSON دی: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

د ستونزو په پایله کې تړل کیږي، د Content-Type (انډیډي ډول او، د ډیرو برخو لپاره، د هغه محدودیت) او د SHA-256 ته د دقیقي بدن بائټونه چې تاسو سپارښتنه وکړئ، او د 15 دقیقې اوږدوالی. د پیسو وروسته، د همدانۍ د درخواست د دوبې: د ورته Content-Type او ورته JSON بټونه، یا د څو برخو پایپ ټکي لپاره (/images/edits, /audio/transcriptions, /audio/translationsډیری HTTP کتابتونونه هر وخت چې دوی یو فورمه کوډوي، یو بل محدودیت انتخاب کوي، نو دا یو ځل کوډ کړئ او دا بټونه دوه ځله سپارل کړئ.

هر پته کولی شي د 30 ستونزو ته د دقیقه په اړه پوښتنه وکړي (د IPv6 پته د خپل کل /64 په توګه حساب کوي). پوښتنو چې د پته په اړه معلوم نلري د 10 دقیقې په اړه د سختو برخه ده، او په ټولو پته کې د ستونزو Nymbot ستونزو په اړه یو عمومي کچه شتون لري؛ د ستونزو څخه دمخه د غوښتنې (د مثال په توګه د یو بدن سره چې د JSON نه شتون لري) د دې په اړه حساب نه کوي. 429 سره Retry-Afterد ګمرک د لوستلو مخکې له خوا سپارل شوی. د بیلابیلو پایپ ټیپونه چې د کلیدي یا تصدیق کولو په لټه کې نلري هم د 120 غیر تصدیق شوي درخواستونو په منځنۍ محدودیت په لټه کې دي. د ګمرک د لوستلو مخکې د تصدیق کولو په لټه کې کیږي، او د غوښتنې چې د ګمرک په لټه کې نلري. Content-Type نه ده application/json یا multipart/form-data د اپلوډونو لپاره) د انکار سره 415 او هرگز د حساب ورکوي.

د نښلولونو قیمتونه د انټرنېټ کې د ټکینونو په اندازې کې دي، د 1.5 & times margin سره، ځکه چې د واقعي شمیره یوازې وروسته وروسته معلوم کیږي. تاسو د ټکینونو لپاره پیسې ورکړئ، او د پیسو غیر کارول برخه د پیسو په توګه راځي د ټیکن لوستل.

د تادیاتو رسولو

د حساب ورکولو سره هر رڼا کیف. د کیف تاسو ته د مخکښ انځور، 64 د شتمنو د بڼې ورکوي. بيا د دې سره ورته غوښتنلیک ته ورسئ:

د پروګرامد هډر
د 402Authorization: L402 <macaroon>:<preimage> (LSAT هم کار کوي)
د پیسوAuthorization: Payment <base64url JSON>، چې د JSON دی {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

د بیلګې په توګه، د بیلګې په توګه، د بیلګې په توګه، د بیلګې په توګه، د بیلګې په توګه. nymbot Object د توازن محصوالت نه لري: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}، او نه X-Nymbot-Balance-Sats header. د پیسو سیسټم سره ادا شوي درخواست هم ترلاسه کیږي Payment-Receipt مخکښ (base64url JSON سره د چمتو id، د پیسو hash as reference, status او timestamp) د سپارلو غوښتنلیکونه د کوم نیم سره تړاو نه لري، نو دوی د پوښتنې تاریخو کې نه ښودل کیږي.

د شرایطوکله چې
402 payment_already_usedهر پیسې د یو غوښتنلیک لپاره پیسې ورکوي. ځواب د دې غوښتنلیک لپاره د نوي چټک دی، نو د کلینټ چې د دې وروستیو اعتبارات (چې lnget همدارنګه) همدارنګه همدارنګه همدارنګه همدارنګه.
402 payment_mismatchد Credential د نورو پای ته صادر شوی، Content-Type یا بدن، یا د دې غوښتنلیک په پرتله لږ پیسې ورکوي. د دې غوښتنلیک لپاره د نوي چټک سره راځي؛ که پیسې ډیر کوچنی وي، تاسو یې پیسې ورکړئ، دا به د پیسو په توګه راځي. د ټیکن لوستل (refund_token او refund_sats په بدن کې)
402 payment_expiredد چمتو کولو وروسته د 15 دقیقې څخه زیات دی. د نوي چمتو سره راځي. که د مخکښ انځور ښیي چې تاسو پیسې ورکړئ، هغه څه چې تاسو پیسې ورکړئ به د پیسو په توګه راځي. د ټیکن لوستل (refund_token او refund_sats په بدن کې)، یو ځل؛ د اعتبار وروسته کارول کیږي.
401 invalid_preimageد مخکښ انځور د فایبر د تادیاتو د تادیاتو تادیاتو ته هش نه کوي. د تادیاتو نه کارول کیږي.
401 invalid_payment_credentialد تصدیق غلط دی، د Nymbot خپور وروسته بدل شوی، یا د پیسو hash نومونه Nymbot هیڅکله د فایبر نه صادر کړ. د macaroon سره د Caveat Nymbot نه پوهيږي، یا سره مخکښ Caveats، راټول کیږي.
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 لکه څنګه چې د keyed یو، 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")؛ که د رینډ د بیلګې په توګه ناکام کیږي، د پیسې په دې کې ځي. د حالت URL ښيي refund_sats د پلورل شوي کار لپاره، مګر هیڅکله د ټکین نه، نو د حالت URL د اشتراک کولو لپاره د پلورل کولو څخه شریک نه کیږي. د ټکین چیک کول د بریالیتوب کار هم حل کوي چې هیڅ څوک نه سروې کوي.

د سپارلو

که د پلټنې غوښتنې ناکام کیږي او د پلورونکي د هڅو لپاره 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 Object د لګولو لپاره د سپارښتنه ټکین لرونکی؛ یو ټانکونه چې اوږدوالی مخکې نه کولی شي لوستل شي د فایل د 30 دقیقې څخه ډیر نه وي، او د واقعي اوږدوالي پورې فرق د سپارښتنه ټکین په توګه راټول کیږي؛ که دا د 30 دقیقې څخه ډیر وي، دا د 30 دقیقې څخه ډیر وي. 413 او ټولې پیسو راټول کیږي. د انډولونو ته هغه څه راټول کیږي چې د تبادلې تبادلې لري. د ناکام ویډیو به د دې ټکین ته راټول کیږي چې د دې سپارښتنه راټول شوی.

د سپارلو ټکین د 256-bit تصادفي کوډ دی. Nymbot یوازې د دې hash ذخیره کوي، او دا د 30 ورځو وروسته ختم کیږي. دا د سپارلو توازن لري، او تاسو کولی شئ:

  • د دې سره ورکړئ. ولډنګ Authorization: Bearer REFUND-… په هره پای کې (د OpenAI SDK دا د API کلید په توګه لیږدوي). د قیمت د ټکانو څخه راځي او هغه څه چې په دې کې پاتې دي (refund_token_sats په nymbot Object). یو ټکین د غوښتنې ځوابونو څخه لږ ارزښت لري. 402 refund_insufficient; د غیر حساب شوي ناکامۍ په ورته token کې د sats راټولوي.
  • چمتو کړئ GET /api/v1/l402/refunds د ورته headers سره راځي {"sats": 237, "status": "open", "expires_at": "..."}.
  • یو token کولی شي په هره دقیقه کې د 60 ځله کارول شي.
  • په NIM کې حرکت وکړئ. دا په د سپارلو وړاندیز په Nymbot اپلیکیشن کې، یا د تماس POST /api/v1/l402/refunds/redeem د A د درخواست په نامه او {"refund_token": "REFUND-...", "balance": "standard"} یا "pro"ټول کریډیټونه به د توازن ته ورسیږي (10 په معياري ډول، 100 په پرو کې); شرطونه چې د API غوښتنلیکونو لپاره د token پر کلک کریډیټ نه کوي.

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 } }