مەزمۇنغا ئاتلاڭ
Nymbotكە قايتىش

بىلىم ئاساسى دىۋېلپەرلەر

بالانص، توپ-ئۇپ ۋە كىيەلەر

نەزرەڭىزنى تەكشۈرۈڭ، Lightning ئارقىلىق پۇlaş قۇشۇڭ، ئۆز ۋاللېتىڭىزدىن ئاپپوماتىك پۇlaş قۇشۇڭ، ھەر بىرگەزەكنىڭ قانچە تۇراكلىق تۇرىدىغىلىقىنى كۆرۈڭ ۋە كود ئارقىلىق ئالما تۇخشۇلارنى باشقۇرۇڭ.

بالانسىنى تەكشۈرۈش

ھەردى ئىبارەت بالانسىڭىز ۋە بۇ كىيىنىڭ كاپىنىڭ قانچە ئىشلىتىلگەنلىكى.

GET https://nymbot.ai/api/v1/credits/balance — API ئۆزتىكىگە ئىھتىياج بار. POST كۆزەتگەن مۇستەرى تەرەپلىر ئۈچۈن بولسا، بۇمۇ ئىشلىدۇ.

balance ھەمدەدىلىك بېتىكوئن باھىسى بىلەن ئىككى قولدىكى قوللىق باھىلىرىنىڭ جەملىكى ดاللاردا بولسا، بىر سان كۈتۈپاتقان قوراللار ئۈچۈن (null ئەگەر باھىنى ئۆچۇپ بولماي قالسا). قېلىدقىسى ك kreditler ۋە sats بولۇپ، ئۇ balanceلارنىڭ چەكلىكىنى ساقلاش ئۇسۇلىدۇر. key سۆراپتۇرىنى تەسۋىرلەيدۇ. يۇقىرى چەكىتىلگەن كۆلىمگە يېتىشگە ئېرىشىدىغان ئاپراتۇر ھەم də balance (بالانس)نى تەكشۈرەلىرىدۇ.

جەۋاب

{
  "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"
  }
}
ھۆلقاي قanda؟
401ئارۇچۇ ياڭلىقنىڭ ئۆزلىكى تالınغان، نۇقسون، ئىزاۋەت قىلىنغان ياكى مۇزداۋ بولۇپ قالغان.

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);

تۆلەش ئۇسۇلىرى

قاندا توپ اپ قىلىش possible ئىگەلىگەنلىكى ۋە چەكلىمە ئىگە. يالغۇز ئۇسۇل لائتنىڭ (Lightning).

GET https://nymbot.ai/api/v1/topup/payment-methods — تالۇ كېرەك ئەمەس.

تاپ-ئوپ (top-up) 10 دان 1,000,000 ساتسىگىچە؛ Pro تاپ-ئوپ ئەقل ئەدىم بىر Pro kredi سېتىۋەلىشى كېرەك، شۇڭا ئۇ ئۇچۇردا 100 ساتسىدىن باشلىنىدۇ. Dollar چىكىرىلىرى بېتكوين باھىسىغا قاراپ ئۆزگىرىپ تۇرىدۇ. bulk_bonus يىقاري تۇتۇنلىق توپلىۇشلارداك ئېلىپ بارىلاتقان قەدەمدىن ئارتۇق بولغان قېلىپچە كىرىمىنى تېخىدەرگە ئوخشاشتىن كۆرسىتىدۇ: 500، 1,000 ياكى 5,000 ساتسىغا ئېتىلىدىغان ستاندارت توپلىۇشلاردا 10%، 15% ياكى 20% ئارتۇق، شۇنداق 5,000، 10,000 ياكى 50,000 ساتسىغا ئېتىلىدىغان Pro توپلىۇشلاردا ئارتۇق.

جەۋاب

{
  "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 قولانغا (invoice) تۈزۈپ، ئۇنىڭ تۈگۈنىگە تايانغان nym نىڭ kredi قېلىپ chiqarىدۇ. ئۇنى خىلطىن Lightning ھەققىگە ئىگە بولغان ھەر قانداق قوللانما ئارقىلىق تۆلەڭ، سېتۇر تۈگىتىلگەنچە تەققىقلەڭ kreditni qo'shish uchun.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning — API ئۆزتىكىگە ئىھتىياج بار.

مەيدانتەپتەلەپ قىلىنىدۇتەپسىۋەر
amountسانھەئەقېمىتى نەچە، ئېرى currencyساتلار ئۈچۈن تۇلدۇق بىر سان.
currencyسىlying (تار)يوقSATS (ئالگىرى سىتلىمىدەكى)، USD ياكىلا BTCDollarلار ھالقىدىكى بىټكوين باھىسىغا قاراپ كونvert قىلىنىدۇ.
tierسىlying (تار)يوقpro (دېئولت) ياكى standard: kredit قاي باشۇڭغا تۈشىدۇ.

ئاساسىي كىرېدىت 10 سات ۋە Pro كىرېدىت 100 سات، قوشۇمچە كۆپلىك بۆنۇسى بىلەن بىگىرى; credits بۇ ئىپات (invoice) نىڭ نېمە قولﺳۇنۇش قىلىدىغانلىقىنى ئەسكەرىتىدۇ.

جەۋاب

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
ھۆلقاي قanda؟
400يولدا يەنە بىر ئۇسۇل (unsupported_method), ماłyلم بولمىغان ۋال্যۇتا (unsupported_currency) ياكى تىرى، يوقاتغان مىقدار، ياكى ئەڭھىچكى مىنىمۇم مىقداردىن تۆۋرەك مىقدار (amount_too_small), 1,000,000 ساتسىدىن يۇقىرى (amount_too_large) ياكى Lightning كومنى تەرىپىدىن رد قىلىندى (amount_out_of_range).
429بۇ ئىسمىڭ ئۈچۈن بىرلىكتە بىرلىكتە سائئەت ئىچىدە 60 نۇسخادىن كۆپ ئىپتېلال (invoices) ياكى بۇlik ئالما تۇرىدىغان ئالماڭىزدىن 120 نۇسخادىن كۆپ ئىپتېلال (invoices) 있ە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);

تۆپ-ئوپ تەكشۈرۈش

تۆلەم سېپتېرنىڭ تۈگەتىلىنگەنلىكىنى سورىماق ۋە تۆلەپ بولغاندىن كېيىن، كىرىتنى قوشۇپ qo'ymaq. تەكشۈرۈش كىرىتنى قايسى تېزلىقتا قوشۇپ قويىدىغىلىقىنى تəkشۈرۈش، شۇڭا تۆلەپ بولغاندىن كېيىن، ھالەت تۆۋەندىكىگە چۈشەنگچە تەكشۈرۈپ تۇرۇش كېرەك credited. كېيىنرىچە تəkرا تəkشۈرۈش ئامانلىق: سىز قانچە مަރުتبە سورىسىڭىزمۇ، ئىقتىدار بىرلىكنىڭ ئۆزىگە تۇشىدۇ.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — ھېسەپ-كىتاپنى ھەسەپلىگەن نام تەرىپىدىن بېرىلىدىغان بىر كىچىك كالىچەگە ئىدۇر.

status دۇغۇشۇ pending (ھਾਲى تۇلانمايدۇ),\\ paid (تۆلەنگەن، ئەمما ھازىرغاچە ھېسابغا كırmىدى; قايتا تəkشۈرۈڭ), credited (بالانسىڭىزدا) ياكى expired (تۆلەنمىغان ۋاقىتىدا). باقىيە مەيدانلىرى ئىنجۇۋاقنىڭ قايتىپ يەتىدىغان تېرىە ئۈچۈن.

جەۋاب

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
ھۆلقاي قanda؟
400ID yaratۇش 호출ىدىكى 64 خەرپتىن ئىبارەت ID ئەمەس.
404سېزنىڭ nym نۇمرىڭىز بىلەن مۇنداق ID تۇرسىدۇغان چوۋۇن يوق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 ئارچىلىكىنى بېرلىشىگە كېرək، ئۇ ئۆزلىكىنىڭ سورىلىرىنى كۆرىدۇ، ياكى قوزالعغان تەمىنلەنگان سورانۇش ھەر بىر كاليېنىڭنى كۆرسىدىغان نىمىڭدىن.

مەيدانتەپتەلەپ قىلىنىدۇتەپسىۋەر
pageبۇتۇن سان (سۆرەش)يوقكەسكەتكىلىگ (Default) 1، ئەڭ مۇمكىن 1,000؛ يىرتتىرى بەگگە ھەقەدەگەرەك پەرەڭ ئۆگىنىس ئەمە 400 invalid_value.
page_countبۇتۇن سان (سۆرەش)يوقبەھەپەلىدىكى قۇرۇلالار سېنى. سîلىق 20، ئەڭ مۇمكىن 100.
start_date
end_date
سىستېمىدىكى سۆز (سۆرىش)يوقISO 8601 ۋاقىت ياكى ۋاقىتلار.
modelسىستېمىدىكى سۆز (سۆرىش)يوقFقط بۇ مودेल.
typeسىستېمىدىكى سۆز (سۆرىش)يوقchat, responses, messages, image, video, speech, transcription ياكىلا embedding.
all_keysبوليان (سۆرىش)يوقتالقا بىلەن: true بىر خەلقنىڭ ھەممە ئالماشتۇرغۇچىلىرىنى ئاندۇرۇپ تۇرىدۇ. سىلدىمە (Default) false.
key_idسىستېمىدىكى سۆز (سۆرىش)يوقImzalangan تەلەپ باشتىلار بىلەن، ياكى... بىلەن 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);

ھېساب تۇيۇش سورىلىشى been requests

تۈگۈنلارنى ياراتۇش، ئۆزگەرتىش ۋە بىكار قىلىش، ھېسابت 요پۇقلىقى ۋە ئارتقاقلارنى ئۆتتۇرىچە تولدۇرۇش ئۈچۈن API تۈگۈنى كېرەك ئەمەس. ئۇلار سىزنىڭ nym ئىزاھاتىڭىزنى ئالىدۇ، شۇناچە سېزىلىپ قالغان تۈگۈن ئۆزىنىڭ چەكلىمىسىگە چۈشۈنچە ئىجرا قىلالاي، ئەمما ھەرگىدەم يەنە بىر تۈگۈن ياراتالمايدۇ ياكى ئۆز چەكلىمىسىنى ئېقىرىق قىلالمايدۇ.

بۇ پروگرامە تېكىمە سىزنىڭ ئۈچۈن مۇنداق قىلىدۇ: ھەممىسى ئۆز ئورنىدا API بەرقتەپ (sheet) بۇ ئېندپอยئنتلارنى ئىشلىتىدۇ. سىزگە پەقەت ئۆز كودىڭىزدىن تۈرلىدىغان كљуچىلاردىن باشقاچىلىق باشقۇرۇش ئۈچۈن بۇ بۆلۈم كەرək.

قوزۇلمە 27235-تۈرلىك (NIP-98) Nostr ھ𝚍ىسىسى بولۇپ، ئۇ base64 فورماتىدا يۆتكىلىدۇ Authorization سۆز بىلەن سەرلىك Nostr ئالدىدا:

ئىلتەكى ۋاقىئە

{
  "kind": 27235,
  "created_at": 1790726400,
  "tags": [
    ["u", "https://nymbot.ai/api/v1/keys"],
    ["method", "POST"],
    ["nonce", "9c4e21f07a3b...16 random bytes in hex"],
    ["payload", "3f1a0d7c8e2b...sha256 of the exact request body in hex"]
  ],
  "content": "",
  "pubkey": "your public key in hex",
  "id": "...",
  "sig": "..."
}
  • u ئىددىەدىكى سۆزالنىڭ تۈمەن URL-ى، سۆزال تۈرۈكى (query string) بىلەن بىگە، ئەسلى يەلىڭان حالىدە.
  • method HTTP ئۇسۇلى.
  • payload خام تەلەپ تېكىستىنىڭ SHA-256 كودى، ھېکسادېسىما (hex) بىلەن. ئۇنى مۇنداق يەردە تەلىپ قىلىنىدۇ POST ۋە PATCH, ۋە سىز ئۆتكۈزگەن ئۇچۇرنىڭ بডিরىسى (body) ھېشىنى چىقىرغان ئۇچۇر بىلەن بايت-بايد (byte for byte) ئوخشاش بولۇشى كېرەك.
  • created_at سېۋەرنىڭ ۋاقىت ساعتىدىن 60 سانىيە ئىچىدە بولىشى كېرەك.
  • ھەر بىر ھەرىكەت بىر مەرتىبە ئىگىلەيدۇ، a GET ئىچىگە كىرگۈزۈلگەن، شۇڭغۇچۇرلانغان سېلىم (header) قايتا ئىشلىتىلى مەمتۇم ئەمەس. ھەر بىر يۈكلىش (request) ئۈچۈن يېڭى سېلىمنى ئىزاھىللىڭ. قوشۇڭ nonce تەگنى تەرەۋۋە تەرەۋۋە قەدر بىلەن بەرىڭ شۇنداققا ئېگەر بىر سېكۇندە ئىككى تەلەپ ئىمزىلىنىسا، ئۇلار ھالەن ئەرگەشكىلىك بولىدۇ.
  • ئىزاھاتلانغان سورەتنىڭ تۇتۇمى ئەڭ كۆپ 64 KB بولىدۇ، ۋە تۇتۇم ... كېرەك. Content-Type: application/json.

Yoqotۇلغان ئەقىدىم (ىېۋېنت) قايتىدۇ 401 missing_nostr_auth; يغىپ، خەتلەنگ، ئىزدۈم، ياكى باشقا URL، ئۇسۇل ياكى كونتاكت (body) ئۈچۈن بولغان يغىپ بېرىلگەن ئۇچۇرلار قايتىدۇ invalid_nostr_auth, خەبارىدا سەۋەبى بىلەن؛ قايتا ئىشلىتىلگەن بىرى قايتىپ كېلىدۇ nostr_auth_replayed. بۇ ئۇچۇرلارغا (endpoints) يى보ڕۇلغان API ئارۇچقىلىقى (key) رەتلىنىدۇ. تۇنجى قۇرۇم (body) ئوقۇلىشىدىن بұلۇنۇپ، ئىزاھ (signature) تەكشىرىلىدۇ، ھەر بىر ئالماق (address) مինاتتە 30تە قېتىم خতা قىلىش ھəkقىگە ئىگىدۇر (IPv6 ئالماقى ئۆزىنىڭ تولۇك /64 قىسىمى دەپ ھېسابلىنىدۇ); شۇندىن كېيىن ئۇ... 429 بىلەن Retry-After.

ب্ৰাউزەرلار بۇ ئەندپอยئىنلارنى پەقەت Nymbotنىڭ ئۆز ساھتلىرىدىنلىق تاللىغىلا چاققا قvdashىدۇ (https://nymbot.ai, https://nymchat.app ۋە ئۇلارنىڭ سۇبڊومینلىرى). باشقا ھەر قايسى س_{{\text{ite}}}$ ئىدارىسىدىكى بىر بەھپدە CORS سېگلىرىنى قايتارمايدۇ، شۇڭا ئۇلار قايتارغان ئۇچۇرنى ئۆقۇۋالالمايدۇ. سکرپت ۋە ئىچكى پروگرامما (native apps) ئىجراەرلىرى، ئۇلار يۈكلىمە يەڭگىھلىمەيدۇ Origin, تەرخىم قىلىنمىغان.

سىزنىڭ ياشۇرغۇچە ئارقىچىسى

Imzalash uchun sizنىڭ nym سىرلىق ئالماشتۇرۇش ئانغىتىڭىز كېرەك (the nsec), ئۇنىڭ بىزگە ئېلىپ بارغان ھەر şeyi: سىزنىڭ ئېتىمىز، تەరిخىڭىز ۋە باقىيەتىڭىزنى ھəkىمىيەت قىلىدۇ. ئۇنى پەقەت ئىشىنىدىغان ماشىنىىڭىزدىكى سکرپت ئورۇنلىرىغا قۇيۇڭ، ئۇنى فىیلغا يېزىپ قالماشتىن، مۇھىت (environment) ئارقىلىق ئوقۇڭ، ۋە مۇمكىن بولغان ۋەقىتتە ئىلوپلۇپ (app) ئىشلىتىشنى ئۇتۇپ قىلىڭ.

بۇ ياردەمچىلەر سېلىقچىنى (header) تاشقى ئېقىمىنى تاشقى ئېقىمىنى قۇرۇشقا ئىدراك قىلىدۇ. بۇ بەھتەرنىڭ كېيىنكى مىساللىرى ئۇنى ئىشلىتىدۇ. ئۇلار سېرىي كېيىنى (secret key) hex shakلىدا تۆۋەندىكىدىن ئېقىسىدى: NOSTR_SECRET_HEX; cURL بولغىنى ئىشلىتىدۇ نەگ̆ n-ئېقىلىق ياكى 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 ۋېرىئەسىنىڭ يۇقىرى قىسىمىدا نېمە كۆرسىتىلىدۇ: سىزنىڭ ئەگەرچى كېيى (public key)، ئىككى تەرەپلىك بالانسى (balance)، قانچە مۆھىر ئالگۇچنىڭ ئالگۇچلىق (ئۆچۈلمىدىغان ياكى ۋاقتى ئۆتمىدىغان) ئىكەنلىكى ۋە ئەتكۈزۈلگەن تېزleيتۈش (automatic 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());

تېگلىرىنى باشقۇرۇش

ئەپنىڭ كاليستى (key list) ئارتىدىكى ئېندپอยئنتلار (endpoints). ئۇلارنىڭ بەككىچە ھەممىسىگە... قۇلالغان ئىستەك. ھەر بىر key بۇ شەكلىدە qayتىرىلىدۇ، ۋاقىتلار ISO 8601 بىلەن ۋە مىقدارلار sats بىلەن:

ئاساسلىق obyekt

{
  "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 بىر تاللانما (key)نى تاللىماق ئۈچۈن كۇيەت، ئەمما ئۇنى ئىشلەتكۈنچە يەر مۇเหมาะสม ئەمەس. تاللانمانىڭ ئۆزى ئەتاپ قىلىنغان باشقۇنچىلىقتا، ئۇ يارىلىنغان ۋاقىتتا بىرلىگىن قايتۇلىدۇ.

ئالما تۈگۈنلىرىنى رەۋان قىلىش

GET https://nymbot.ai/api/v1/keys — ئىزاqلىندى.

مەيدانتەپتەلەپ قىلىنىدۇتەپسىۋەر
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سىlying (تار)ھەئە1 تىنچە 40 خarakka چەEngلىك، ئاكتىپ تۈگۈملىرىڭىزدىن بىརەملىك (بۇگۈنكى بەلگىلىرىنى بىچارا قارايدۇغۇچە).
limit_satsبۇت سانيوقساتلار بىلندىن سանքىلاق تۇتۇمى، ئەھۋال مۇزمۇ 1 بولسا. چەكلىمە بولماسلىق ئۈچۈن بۇنى چىقىرىپ تاشلاڭ.
reset_periodسىlying (تار)يوقdaily, weekly ياكىلا monthly. كېرىلگەنلىرىنى ئېھتىياج قىلىدۇ limit_satsئېقىلىپ كەتمەيدىغان چەگەرلىك ئۈچۈن ئۇنى چىقىرىپ تاشلاڭ.
expire_atمەھلېم ياكى بىرلىق سانيوقئارچۇرى ئىشلىمەيدىغان ۋاقىتتا: ISO 8601 ۋاقىتى ياكى 1970 يىلدىن بۇلغان millisecondلار.

Javob (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"
  }
}
ھۆلقاي قanda؟
400Noman yoq yoki nom جە quite uzun; ishlatىلىپ ئىكەنGen nom (duplicate_name`); تەنماڽ 1 بولغان، تۇرتۇم سان بولمىغان چەكلىمە؛ چەكلىمىسىز قايتالاش müddىتى؛ ئۆتۈپ كېتىلگەن ۋادىيە؛ بىلىنمەيدىغان maydon (`unknown_parameter); ياكى 25 ئالدىن ئالماقلىق كىي يۇمقۇچلار بار (too_many_keys).
429بۇ نىم (nym) تەرىپىدە بىر سائەت ئىچىدە 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} — ئىزاqلىندى.

qayتىرىشلار {"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} — ئىزاqلىندى.

...نىڭ بىرىنى يەتكۈزۈپ بېرىڭ name, limit_sats, reset_period ۋە expire_at, ئالدىنكى كاليچە ئۆزىدىكى قىلالغان قىدارلار بىلەن بىرلىكتە. null بىرmaydonni tozalaydi: cheklemisiz, qayta tiklemisiz, muddetsiz. Qayta tiklash davrini o'zgartirish noldan boshlanadigan yangi davrni boshlaydi. Bek qilingan kalitni o'zgartirib bo'lmaydi (400 key_revoked). قايتۇرۇشلار {"data": {…}} ئىچكى يىنىتۇلغان كىي obyektى بىلەن.

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} — ئىزاqلىندى.

تۆۋەلىك تۈگۈننى تونۇش قىلمايدۇ، تۇگۇنلىق. ئۇ تىزىمدە قۇلايدۇ revoked_at قىلدۇرۇلىدۇ، ۋە بىلەن كۆرۈلىدۇ include_revoked=trueكەلىپ تۇزۇلغان كىچىكلىك (key)نىڭ ئالدىنكىدە ئالدىن تۇزۇلغان بولغانلىقىنى қайتا تۇزۇلغان دەپ كۆرسىتىش، بىر خىل جاۋاب بېرىدۇ. تېكىنە تۇزۇلغان 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 ئاپتو-تاپ-ئۇپ

Lightning كومسالىنى Nostr Wallet Connect بىلەن باغلىڭ، API ئىشلىتىش مۇبارەكلىك ئ Eichlanىپ قازى قۇمدىن قالغاندا Nymbot مۇبارەكلىكni ئۆزى ئۆتكىزۈپ بېرىدۇ. ایپنىڭ API بەپەرەكىسىدا خۇددى شۇلا ئايرمات تېزلىق ئېتراپلىرى بار؛ ئۇلار بۇنىڭ ئارقىسىدىكى ئېتراپلىق بېكىتىش نۇقتىلىرىدۇر. ئۇلارنىڭ بارلىقىغا ... كېرەك قوزالعغان تەمىنلەنگان سورانۇش.

ئىشلىشىچە تەرتىبى: بىر تېكىستلىك APIگە تاللانغان بايلانستىن تۇھوملىق تۇھۇم ئېلىۋالغاندىن كېيىن، ئەگەر ئۇ بايلانست ئالدىن بېلگىلىگەن چەكلىك مەبلەغدىن تۆۋرەكتە قอล قالسە، Nymbot سىزنىڭ تۇھۇم قوشۇش مەبلەغىڭىزگە ئاساسلانغان ھېساب-كىتاپ (invoice) تەپسىلىدىن تەھرىپ قىلىدۇ، كۆتۈرۈش ھەرىكىتىنى باشلاش ئۈچۈن كۆتۈرۈش كۇتۇپچىسىغا (wallet) تۇھۇم تۇتۇش ئۆتنىدىن سۈرەيدۇ ۋە ك kreditنى قوشۇپ قويىدۇ. ئۇ ھەر بىر nym ۋە بايلانست ئۈچۈن 5 مىنۇتتۇن بىر تۇھۇم قوشۇش ئىچىدە ئەڭ كۆپ بىرلىقتا بىرلىگىن تۇھۇم قوشىدۇ، شۇناچە تىزگىتلىگەن تۇھۇم سورىلىشىنىڭ كۆپلىكى كۆتۈرۈش كۇتۇپچىسىنى تۈگىتىپ يۈگىتۈپ سالمايدۇ. پروگراممالىرىدىكى ئىشلىتىش بۇ ھەرىكەتنى قوزغىتىدۇ دەلمەysen. ئەڭ ئاخىرقى تۇھۇم قوشۇشنىڭ ۋاقىتى ۋە مىقدارى، شۇنىڭلا ئەڭ ئاخىرقى خاتالىق سېزگىلەر سېزگىلەر مەزىمۇتىدىن (settings) تاپىلسىدۇ؛ ئەگەر بىر خاتالىقتىن كېيىن تۇھۇم تۇتۇش مۇۋەپپەقىيەتلىك ئۆتكەن بولسا، ئۇنىڭ ھېساب-كىتابىنى تەكشۈرىش... تۆپ-آپ تۇزۇمى ئېلىپ بېرىش.

ھېچ قانداق قولخانى (wallet) بىرلىكتىلىشىشتىن بۇرە

ئلگىتلىنىش سطرى (connection string) ئىچىدەك ئېلىپ بارلىغانلارنىڭ سىزنىڭ كومالىڭىزدىن تۇলাম قىلىش سورىسىنى سۈرەشلىرىگە مۇھەممەلىك قىلىدۇ. Nymbot ب ئۇنى شىفىرلانغان ھالدا ساقلىغان بولۇپ، ئۇنى پەقەت ئۆزىنىڭ تۇلام ئېلىپ بارىدىغان ئىدرەسى (top-up invoice) ئۈچۈن ئىشلەتىدۇ، ئەمما بۇنىڭ ئۈچۈن پەقەت شۇ مەقسەتلىك بىر تۇلانچىنى قۇرۇپ، كومالىڭىزدا بىر ئىشلەتلىنىش ب۹جېتىنى بېكىتىپ قويۇڭ، شۇنداققا سىز تاللىغان ساننىڭ ئۈنچۈنلە مىڭ تۇلام قىلىش مۇمكىن بولىدۇ. كومالنىڭ بۇنى قوللاشى كېرەك pay_invoice.

ھامانلىقنى تۇگۇلۇشى (Connecting a wallet)

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — ئىزاqلىندى.

مەيدانتەپتەلەپ قىلىنىدۇتەپسىۋەر
nwc_urlسىlying (تار)ھەئەئالاتەلىش سطرى، باشلانغان nostr+walletconnect://. Nymbot كومىنى تاللاشنى سۈرىگىلىدۇ get_info ئېگىزىگە يەتكۈزۈش ئالدىدا، ئۇنى شىفىرلانغان ھالدا ساقلايدۇ.
threshold_satsبۇت سانھەئەبالانستا بۇ سېپتە مىڭدىن كۆپ بولمىغان چەكتە تېخىلاڭ. ئەڭ كەم 1,000.
topup_satsبۇت سانھەئەھەر كېلىسىدە قانچە قوشۇشى كېرەك. 1,000 تىن 1,000,000 ساتسىغاچ.
tierسىlying (تار)يوقpro (دېئولت) ياكى standardبەراقەتنى كۆزەتۈپ تۇپىپ تəkملەش.

جەۋاب

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
ھۆلقاي قanda؟
400ئاقلانتىش سطرى ئەمەس (invalid_nwc_url); ۋاللېت ئۆزۈنىڭ رېلېيىسى ئارقىلىق جاۋاب بیرمىدى (nwc_unreachable) ياكى چەككە رەت قىلدى (nwc_rejected); باغلىنىش تۆلەۋەچىلەرنى تۆلەۋەلمەيدۇ (nwc_missing_permission); ياكى چىغىچە سىزلىق چىققان مىقدار.
501بۇ سېرۋەر ئۈچۈن ئۆتتۈگىچە توپلىغۇھ (automatic top-ups) ئاكتىپ بولمايدۇ (nwc_unavailable). يانلىق ئىقتىدارلارنىڭ ئىككىسىگە دەمlačقان.

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 — ئىزاqلىندى.

بىرىلىشىلگەندىكى شۇلىش ئوبyekتىنىڭ ئۆزىنى قايتۇرىدۇ، بىلەن connected: false ۋە باشقا كاتەكلىرى null ھېچقانداق كومپلەكت (wallet) تۇگۇلماغان چاڭ. ئۇلىنىش سطرىنىڭ ئۆزى ھېچقىشانقا qayتۇرۇلمىغان.

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 — ئىزاqلىندى.

ساكلىنىپ تۇتۇلغان تۇتقانلىق سېلىنغان جۈملىنى ئۆچۈرۈدۇ. باشقا تەكمىلەشلىك ئېلىپ بارىلمىدۇ. ئەھمىيەتلىك بولۇپ، سىز ۋاللېتىڭىزدىن تۇتقانلىقنى بېگەللىمەشقا ئېلىپ بارالايسىز.

جەۋاب

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

تېخىنىچە تۈگۈنلىق (key) بولمايدىغان ھالدا ھەر بىر سورۇش ئۈچۈن تۆلەش

ھەركى بىر تەلەپ تۇتۇش ئۈچۈن ھەركى بىر تەلەپ ئۈچۈن ئالدىن تەyinلەنغان باھىدىكى ئۇچۇرىلارنى Lightning ئارقىلىق ھەساب، كاليچە ۋە بالانستا يوق دەۋاتىدۇ: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations ۋە POST /embeddings. Chat, Javaplar va Xabarlar ھەمىدە ھۆپكىگە ئى ṣeتىلىشىشى كېرەك. ھۆپكى بىلەن بىرگىدە يىبىلىنغان سۆرىش ئائادەتتىكىدەك بالانستا تۇتۇلىدۇ؛ تۆلەم تەرەپىدىن جەريان پەقەت ھۆپكى يىبىلىنмәگەن ھالدا باشلىنىدۇ.

Nymbot بىر تۈزۈمدىن بىر ئىدىيەنىڭ ئىككى نۇسخىسىنى سۆزلەيدۇ: Lightning Labs' L402 (ئۇنىڭ ئ eskiلىك ئىسمى بىلەن بېگىNLلىلىنىشقا رۇخsat بېرىلغان، LSAT) ۋە IETF تۈزۈلمىسى تۆلەش HTTP تەسىقلاش شېمىسى بىلەن lightning ئۇسۇل ۋە charge نىيەت. مۇشتارىيىڭىز قايسىنى تۇنىدىLS، شۇنى ئىشلىتىڭ.

ئۆز سېۋېرىڭىزنى يېتەكلىش

ئاليما بېزlikسىز ت Sayles pay qilish faqat ... بولغاندا ۈچۈلىدۇ API_L402_SECRET ھۆپىكى ئەڭ چەكىمدىن 32 تەكى راندوم بايتنى تۇتۇپ تۇرىدۇ، ھېكس (64 خاراكتېر) ياكى base64 (44) شەكلىدە. بىرىنى قىلىپ بېرىڭ openssl rand -hex 32. قىسقا بولغان ياكى تاپقىلىشى مۇمكىن بولغان قىممەت بۇ خاسلىقتنى ئۆچۈرۈپ، نىما ئۈچۈن ئۆچۈngenلىگىنى قېلىپ تۇتاۋلىغانلىقىنى بەلگىلەيدۇ. ئۇنى ئالماشتۇرۇش ئۈچۈن، كۆلتىمە قىممەتنى تۆۋەندىكىگە كۆچۈرۈڭ API_L402_SECRET_PREVIOUS بىر كۈن مۇddەتلىك: كىرىش مەلۇماتلىرى، ھالەت URL-لىرى ۋە ئۇنىڭ ئاساسىدا تەخلىق قىلىنغان سىنلار ۋاقتى تۇگەتكىچە ئىشلىۋەلىدۇ.

چەلىشau

تەلەپنى ھېچنە بولمىغان ھالدا يөڭگۈلەڭىز Authorization header. ئەگەر ئۇيغۇن بولسا، ھېچ نאַר ئىشلىمەيدۇ، ۋە سىز ئالىسىز 402 Payment Required بۇ تالاش تەمىنلىگەن مۇراچاتنىڭ تۇگۇل مۇلازماتلار بېلگىكى باھىسىگە ئۇยวۇشمىغان تۇگۇل ئىنجوائس بىلەن: standard credit ئۈچۈن 10 sats ياكى Pro credit ئۈچۈن 100 sats بېلگىلىگەن، كالي تۇلىغان باھىمۇڭ ئولۇش قوللىنىلغان: ۋە تۇگۇل sat بىلەن يۇقىرىرائىن رەندىلىگەن (ھەقىقىەتتىن ئەرلەمىدىن 1 sat، ۋە ئەڭ كەمى 0.05 credit minimum). جاۋاب ئۈچۈن үчە WWW-Authenticate ئىددىي ئىنجويس (invoice) ئۈچۈن قiyachi سۈپىتىدە ئىگىلەگەن مۇ rămمىزلىكلىرى:

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)) ۋە سىز يەڭگەن ئەسكەرى جەزمىنىڭ (body bytes) SHA-256 نىڭ ئۆزىگە تەڭلىك بولۇپ، 15 مىنۇت داۋاملىنىدۇ. تۆلەۋەنلىكتىن كېيىن، يەڭگەن دەماقشۇش قىسمى تəkراپ سۆرەنگ: شۇنىڭ ئۆزى Content-Type ۋە شۇنىڭدا ئانغى JSON بايتلىرى، ياكى multipart ئېندپอยئەتلىرى ئۈچۈن (/images/edits, /audio/transcriptions, /audio/translations) بىر خەلقئارا جەھت (multipart) تۇخۇمىنى بىر خىل سېلىقلاش (boundary) بىلەن. كۆپچە HTTP كىتەپخانىلىرى ھەر بىر فورمنى كودلاشتا يېڭى سېلىقلاشنى تاللايدۇ، شۇڭا ئۇنى بىرلىكنىڭ بىر قېتىم كودلاش ۋە ئۇ شۇ بايتلارنى ئىككى قېتىم يөнلەتىش تېخنىكىسىنى ئىشلىتىڭ.

ھەر بىر ئالما تېگىش ئەھۋال (address) ئۈچىنچە مىنېتتە 30 تىن تەلىپ قىلىشقا ھوقۇقى بار (بىر IPv6 ئالما تېگىش ئەھۋالى ئۇنىڭ تۇۇلىق /64 قىسمى دەپ ھېسابلىنىدۇ). ئالما تېگىش ئەھۋالى مۇتاۋەچچە بولماغان تەلىپلىر مىنېتتە 10 دان تىن قattiئراق چەكلىمەگە تۇسىنىدۇ، شۇنداقلا بىزنىڭ بۈتۈنلەھ ئالما تېگىش ئەھۋاللىرى بويچە Nymbot تۇغۇپ چىقىرىدىغان تەلىپلەرگە ئۈمۇمىي بىر چەكلىمە بار؛ تەلىپ بىر تەلىپ قىلىش پۈتۈنلەپ ئاتىلىشقا ئالدىن رەت قىلىنغان بولسا (مەسىلەن، JSON فورماتىغا ماس كەلمەيدىغان مەزمۇن بىلەن) ئۇ بۇ ھېسابغا ھېسابلانمايدۇ. شۇنىڭدە ئۇنىڭ جاۋابى: 429 بىلەن Retry-After, تۇنجى مەزمۇن ئوقىلىشىن ئالدىن يەڭىلىدۇ. ئۆزىگە تايار كىرىش جەدۋىلى ياكى كىچىكلىكلىك تۇتقۇچىسىز چاقۇرۇلغان ئۇچكىلار (endpoints) ھەر بىر ئالماق ئۈچۈن مինېتىتتىن 120 تۇتقۇچىسىز چاقۇرۇش لىمىتىنىڭ ئىچىگە ھېسابلىنىدۇ. تۇتقۇچىسىز چاقۇرۇشلار تۇتقۇچىسى يەڭىلىشىن ئالدىن تەكشىرىلىدۇ، شۇنداق ئۇچكى تۇتقۇچىسى بار چاقۇرۇشلار... Content-Type دېگەن ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەمەس ئەم application/json (ياكىلاسە multipart/form-data يۈكلەشلىرى ئۈچۈن) بىلەن رەت قىلىندى 415 ۋە ھەرگىدەم ئەلبېل ۋېنىڭ يېتىۋاتىدۇ.

ئېمبېدىڭلار (Embeddings) كىرىش توكىنلىرىنىڭ تەخմىنلىگىگە ئاساسلانغان 1.5× مۇناسىۋەتلىك قېتىم بىلەن باھالানىدۇ، چۈنكى ئەسلى سانلىق ئۇچۇرلا ئۇنىڭ ئۆتۈشىدىن كېيىن ئېلىنىدۇ. سىز ئېلىپ كېلىنگەن توكىنلار ئۈچۈن تۈگۈن تۇرىغان پۇلنى تۆلەۋېسىز، تۆلەنگەن پۇلدىڭىزنىڭ ئىزدەلمەيدىغان قىسىمى قايتىش قىلىنىدۇ تۆگەن پۇlaş قايتۇرۇش بىچكىسى.

تొلېش يەتكەزۈش

ھەر قانداق Lightning كومىلتېلىسى (wallet) ئارقىلىق ئىپاتنى تۆلەڭ. كومىلتېلىس سىزگە 64 دان گېكسادېسىمل (hex) خاراكتېرىدىن ئىبارەت بولغان پرېئىماجنى (preimage) بېرىدۇ. سۇنرا بۇلاردىن بىرى بىلەن ئوخشاش تەلەپنى يۈگۈتۈڭ:

تېزلىك جەريانى (Scheme)سەھەپە
L402Authorization: L402 <macaroon>:<preimage> (LSAT مۇ ئىشلىيدۇ)
تۆلەشAuthorization: Payment <base64url JSON>, JSON قەدەມ ياشىغان يەر قاندا؟ {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

تۆلەلمە سۆراۋ، تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ تېخىمۇ ت nymbot ئوبجېكت تېكىمدىن balance maydalanىلىرى يوق: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}, ۋە ئۇنداق بولمايدۇ X-Nymbot-Balance-Sats سەھەيفە. A تۆلەش تىزمىسى بىلەن تۆلەنگەن سۆرات بولسا، ئۇنىڭ ئۆزىگە ئاپاق ... دەۋەت Payment-Receipt باشلىق (base64url JSON تەھاdda IDسى، تۇلوم ჰېشى كىبى reference, status ۋە timestamp). تۇلوۋ قالغان سۆۋرىشلار ھېچقانداق نىمغا باغلىنغان ئەمەس، شۇڭچىلىك ئۇلار سۆۋرىش تارىخىدا كۆرۈنمەيدۇ.

ھۆلقاي قanda؟
402 payment_already_usedھەر بىر تۇløم بىر سورۇۋغا تۆلەنىدۇ. جاۋاب بۇ سورۇۋ ئۈچۈن يىتتىلاشقا ئېقىنىش بولىدۇ، شۇڭلۇق ئۆتكىچە كىرىش جەدۋىلىنى كېچىكىشلاپ قالغان مۇلازىمەت (بۇگەچەلىگەن) lnget بۇنىڭ تۇگىنىڭ يەنە تۆلەيمەن دېگەنلىكىدۇر.
402 payment_mismatchبۇ تېخنا سىپىتى باشقا مەۋجۇت نۇقتىغا چىقىرىلغان، Content-Type يا جەزم، ياكى بۇ ئېلىپ بايرانلىق نەرۋەنىڭ قىممىتىدىن كەم تۆلەگەن بولسا، ھەمدە بۇ ئېلىپ بايرانلىق ئۆچۈمگە يېڭى بىر قىيىنچىلىق كېلىپ تۇشىدۇ؛ ئەگەر تۆلەش كۆپ مۇزمۇ، سىز تۆلгән مىقدار قايتىپ كېلىدۇ... تۆگەن پۇlaş قايتۇرۇش بىچكىسى (refund_token ۋە refund_sats ۋەچىكىدە (tana bədەنىدە).
402 payment_expiredتارتانغ باشلانغاندىن بۇيان 15 dəقىقىدىن كۆپ ۋاقىت ئۆتتى. ئۇنىڭ بىلەن بىرگە يېڭى تارتانغ كېلىدۇ. ئەگەر تۈپكى رەسىم (preimage) تۆلەۋىدىڭىزنى كۆرسەتسە، تۆلгәнلىك نەرسىڭىز ... بولۇپ قايتىۋېلىدۇ. تۆگەن پۇlaş قايتۇرۇش بىچكىسى (refund_token ۋە refund_sats بادیدا), بىرلىگىن; كېرىم ئۆز ئىشلىتىلۈش ئىقتىدارىنى تەسىللەپ بولىدۇ.
401 invalid_preimagePreimage ئىنچەتنىڭ تومۇش ھەسىھلىگىگە (payment hash) ئۇچۇرلىغۇچۇ (hash) بولمايدۇ. تومۇش ئىستifadə قىلىنمىغان.
401 invalid_payment_credentialئەھلىيەت خতা ئېلىپ تۈزۈلگەن، Nymbot ئۇنى چىقىرىپ بېرىشتىن كېيىن ئۆزگەرتىلگەن، ياكى Nymbot تەرىپىدىن ھېسەپ تۈزۈلگەن ھېسەپ باشلىققا (payment hash) ئۇيغۇن كېلىشмәيدۇ. Nymbotنىڭ بىلدۈرمەيدىغان شەرت (caveat) بار ياكى شەرتلەر ئارىسىدا تەرەپلاش (conflicting) بار بولغان macaroon رەتلەنيدۇ.
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"));

mijozلار ئۇنىڭ ئاستىدا تاشلانغان mppx Lightning ئۇسۇلى بىلەن تۇلانچىلارغا تۇلانمىنى چەلەنچىنى ئۆزلىرى باشقارۇشقا مۇھിملىك قىلىڭ؛ ئۇلارنى ئېنېندپอยت تەڭگىسىگە يۆتلىتىپ، تۇلاشقا رۇخسەت قىلىڭ.

Videolar

تۆلەنگەن POST /videos جاۋابلار 202 تۈگۈنلىغان بيريگىدەك، يەنە بىرەنمە status_url: GET ئىشنى باشقا ئېلىپ baryish uchun ھېچقانداق ئالما بولمىغان. ئۇ ئىزاھلانغان ۋە ئىش ئېلىپ بارىلانغان ۋاقىتنىڭمۇ بىلەن 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 بۇ جاۋابدىن: ئۇيغۇرچە بىلەن بۇ يەرگە تېگىشلىك كۆRSētuلىدۇ. วىدېيۆ تەھرىرلەنگەن ۋاقىتتا ئۇ خالي بولىدۇ (GET /api/v1/l402/refunds جاۋابلار "status": "pending"); ئەگەر رەندەرلەش (render) ھېسابلاشمايقىچە قاتالىپ قالسا، تۈگۈنلىك تۈگۈنلىكلىرى تۇگۇلغان ھۆزمىدېك تۇگۈنلىكلىرى تۇگۈنلىرىغا تۇگۈنلىرىگە تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا تۇگۈنلىرىغا ت refund_sats تۆلەمه سىندۈرۈلگەن ئىش ئۇچۇن، لېكىن ھېچقىانداق توكن (token) بولمىدىغا ئانتقى، شۇڭچۇن ھالەت URL بېرىش تۆلەمه سىندۈرۈلۈشىنى بېرىلمەيدۇ. توكننى تەكشۈرۈش، ھېچkim تەكشۈرمىدىغان س𝘾پىشلۇق (failed) ئىشنى暮 چېچىپ تۈگىتىشchi دە.

qayتارما qilishلار

ئەگەر تۇلانما پۇللىق سورۇۋ تۇڭغۇچلىق بولۇپ، تۇلانما قىلغاندا تەڭگىشلىكچى Nymbot نىڭ ھەسىبابىدىن پۇل ئېلىۋاتقان بولسا، پۇل ئېلىنىپ قالىدۇ ۋە خاتا خەبارىدە بۇنىڭ ئۇچۇرى بايان قىلىنىدۇ، ئۇنىڭ بىلەن charged_sats, تاللانغا (keyed) يىلگۇچى تاللانغان تەمىنلىگىچە. ئەگەر تومۇسلىغۇچە پۇل ئىلگىلىمىسەن، خاتالىق ئۆتمىدۇ تۆگەن پۇlaş قايتۇرۇش بىچكىسى تۆلەنغان پۇlaşقا لايىق:

{
  "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 ئوبجېكت يوق باشقا ئۈچۈن قايتارما تېكىنى (refund token) تېخلىگەن؛ بۇنىڭ ئالدىن ئۇزۇنلۇقى ئېچىلىپ بولمايدىغان تېخستirish (transcription) ھەقلىنىشى فائلنىڭ ئەڭ ئۇزۇن بولۇشى مۇمكىن بولغان ئۇزۇنلىققا قاراپ (ھەرگەز 30 مىنۇتتىن كۆپ بولمايدۇ) ھESAPلانىدۇ، ئەسلى ئۇزۇنلىقى بىلەن ئارا مەزۇل بولغان فارقى قايتارما تېكىنى (refund token) قىلىپ قايتۇرۇلىدۇ؛ ئەگەر ئۇنىڭ 30 مىنۇتتىن ئۇزۇن ئىكەنلىكى ئẢزلىقنى بىلدۈرسە، ئۇ følgende بىلەن قەتىگە چəkلىدۇ 413 ۋە تۇمۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل تومۇل ت

qayتۇرۇش توكىنى تەرەپىدىن تەڭگى تۈزۈلگەن تەرەپىكىچە 256 بتلىق تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرەپىكىچە تەرە

  • ئۇنىڭ ئارقىلىق تۆلەڭ. ئۆپكىگە يөڭگۈلە ning (Öpkegè yөnggülè) or simply: ئۆپكىگە يөڭگۈلە (Send) -> يەتكۈزۈش (Yétküzüsh) Authorization: Bearer REFUND-… يۇقۇرىدىكى تۈگۈنلەرنىڭ ھەرھانغىسىدا (OpenAI SDK بۇرۇنكى ئاپىكې (API) ئالماشتۇرۇش کالي://$ كىچىك تۈگۈن كۆلەമിگە ئاساسلانغان بىر باھىغا ئىگە ۋە قอลغان قىسىم ئۇنىڭ ئۈسىدە قالىدۇ (refund_token_sats دا nymbot ئۇچۇنچە (object). يىلجاككە قارىغاندا قیممىتىگە كىچىك بولغان تېگىش جەۋاب بېرىدۇ 402 refund_insufficient; ھېسابغا ئېلىنمەگەن مۇشۇتلىق ساتوشىلارنى شۇ توكنىنىڭ ئۆزىگە قايتۇرىدۇ.
  • تەكشۈرۈڭ. GET /api/v1/l402/refunds ھەمان سەھەپە (header) بىلەن qaytarىدۇ {"sats": 237, "status": "open", "expires_at": "..."}.
  • بىر توكىن بىر مىنەتتە ئەڭ كۆپ 60 تաբ ئىشلىتىلىشى مۇمكىن.
  • ئۇنى نىمغا (nym) كۆچۈرۈڭ. ئۇنىڭ ئىچىگە يېسەپ تىزىملەڭ ھەদিيەنى ئىشلىتىش Nymbot ایپىدا، ياكى قارىڭ POST /api/v1/l402/refunds/redeem بىز bilan قوزالعغان تەمىنلەنگان سورانۇش ۋە {"refund_token": "REFUND-...", "balance": "standard"} (ياكىلاسە "pro"). پۈتۈلۈك kreditلار بالانساغا (standardda ھەر بىر بولغاچە 10 sats، Pro دا 100 sats) ئۆتۈپ كېتىدۇ؛ پۈتۈلۈك kredit بولمايدىغان sats-lar 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 } }