بىلىم ئاساسى دىۋېلپەرلەر
بالانص، توپ-ئۇپ ۋە كىيەلەر
نەزرەڭىزنى تەكشۈرۈڭ، 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؟ |
|---|---|
400 | ID 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_dateend_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) بىلەن بىگە، ئەسلى يەلىڭان حالىدە.methodHTTP ئۇسۇلى.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؟ |
|---|---|
400 | Noman 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) تاپىلسىدۇ؛ ئەگەر بىر خاتالىقتىن كېيىن تۇھۇم تۇتۇش مۇۋەپپەقىيەتلىك ئۆتكەن بولسا، ئۇنىڭ ھېساب-كىتابىنى تەكشۈرىش... تۆپ-آپ تۇزۇمى ئېلىپ بېرىش.
ئلگىتلىنىش سطرى (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) | سەھەپە |
|---|---|
| L402 | Authorization: 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_preimage | Preimage ئىنچەتنىڭ تومۇش ھەسىھلىگىگە (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). يىلجاككە قارىغاندا قیممىتىگە كىچىك بولغان تېگىش جەۋاب بېرىدۇ402refund_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 } }