Пойгоҳи дониш Таҳиягарон
Баланс, такмил кардани маблағ ва калидҳо
Санҷида намуда бинед, ки чӣ доред, тавсиқи маблағ тавассути Lightning, тавсиқи автоматикӣ аз пули худатон, дидани арзиши ҳар як дархост ва идораи калитҳо тавассути код.
Ин саҳифа барои роҳат бо мошин тарҷума шудааст. Нусхаи аслии англисӣ версияи татбиқшаванда аст.
Санҷидани баланс
Ҳамдомани ҳарду шумо ва он ки чӣ қадар аз лимити ин калид истифода шудааст.
GET https://nymbot.ai/api/v1/credits/balance — ба калиди API ниёз дорад. POST барои муштариёне, ки инро интизор мешаванд, кор мекунад.
balance оё ду тавозун дар маҷмӯъ бо нархи кунунии Биткоин бо доллар мебошанд, барои
асбобҳое, ки як рақами ягонаро интизор мешаванд (null агар нарх хонда нашуда тавонад). Боқимонда дар
кредитҳо ва сатсҳост, ки маҳз ҳамин тавр маблағҳо нигоҳ дошта мешаванд. key тавсиф мекунад калидеро,
ки пурсид. Калиде, ки ба сатҳи ниҳоӣ расидааст, ҳоло ҳам метавонад балансро санҷад.
Ҷавоб
{
"balance": 49.18,
"balance_sats": 42037,
"standard": { "credits": 120.4, "sats": 1204 },
"pro": { "credits": 408.33, "sats": 40833 },
"key": {
"id": "4f0c9a1be27d3856",
"name": "laptop scripts",
"limit_sats": 20000,
"period_used_sats": 3412,
"total_used_sats": 18230,
"reset_period": "monthly",
"reset_at": "2026-10-01T00:00:00Z"
}
}
| Ҳолат | Кай |
|---|---|
401 | Калид гум шудааст, номаълум аст, ботил шудааст ё муҳлати амалиаш ба охир расидааст. |
cURL
curl https://nymbot.ai/api/v1/credits/balance \
-H "Authorization: Bearer $NYMBOT_API_KEY"
Python
import os
import requests
res = requests.get(
"https://nymbot.ai/api/v1/credits/balance",
headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
)
balance = res.json()
print(balance["standard"]["sats"], balance["pro"]["sats"])
JavaScript
const res = await fetch("https://nymbot.ai/api/v1/credits/balance", {
headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
const balance = await res.json();
console.log(balance.standard.sats, balance.pro.sats);
Усулҳои пардохт
Чӣ тавр шумо метавонед маблағ кунед ва маҳдудиятҳо. Lightning ягона усул аст.
GET https://nymbot.ai/api/v1/topup/payment-methods — калид лозим нест.
Иловаи маблағ аз 10 то 1,000,000 сатс мебошад; иловаи маблағи Pro бояд ҳадди ақал як кредити Pro-ро харад, бинобар ин он аз 100 сатс оғоз мешавад. Маҳдудиятҳои доллар аз нархи Биткоин вобастаанд. bulk_bonus кредитҳои иловагиро ҳангоми пули бештар илова кардан рӯйхат мекунад, ҳамон тавре ки дар замима аст: 10%, 15% ё 20% бештар ҳангоми пули стандартии 500, 1,000 ё 5,000 sats, ва ҳангоми пули Pro аз 5,000, 10,000 ё 50,000 sats.
Ҷавоб
{
"supported_methods": [
{
"method": "btc-lightning",
"display_name": "Bitcoin Lightning",
"supported_currencies": ["SATS", "USD", "BTC"],
"limits": {
"SATS": { "min": 10, "max": 1000000 },
"USD": { "min": 0.02, "max": 1170 },
"BTC": { "min": 1e-7, "max": 0.01 }
},
"tiers": ["standard", "pro"],
"default_tier": "pro",
"tier_min_sats": { "standard": 10, "pro": 100 },
"sats_per_credit": { "standard": 10, "pro": 100 },
"bulk_bonus": [
{ "bonus": 0.1, "standard_sats": 500, "pro_sats": 5000 },
{ "bonus": 0.15, "standard_sats": 1000, "pro_sats": 10000 },
{ "bonus": 0.2, "standard_sats": 5000, "pro_sats": 50000 }
]
}
]
}
cURL
curl https://nymbot.ai/api/v1/topup/payment-methods
Python
import requests
methods = requests.get("https://nymbot.ai/api/v1/topup/payment-methods").json()
print(methods["supported_methods"][0]["limits"])
JavaScript
const methods = await (await fetch("https://nymbot.ai/api/v1/topup/payment-methods")).json();
console.log(methods.supported_methods[0].limits);
Пур кардани маблағ тавассути Lightning
Сарфиқи инволси Lightning, ки ба nym, ки калид ба он тааллуқ дорад, кредит илова мекунад. Онро аз ҳар як коши Lightning пардохт кунед, сипас тафтиш кунед барои илова кардани қарз.
POST https://nymbot.ai/api/v1/topup/create/btc-lightning — ба калиди API ниёз дорад.
| Майдон | Навъ | Лозим аст | Тавсиф |
|---|---|---|---|
amount | рақам | Бале | Чӣ қадар, дар currencyЯк адади бутун барои сатс. |
currency | сатр | Не | SATS (стандартӣ), USD ё BTCДолларҳо бо нархи ҷорӣ аз Bitcoin табдил дода мешаванд. |
tier | сатр | Не | pro (дифолтӣ) ё standard: ба кадом баробар (баланс) кредит меравад. |
Кредити стандартӣ 10 сатс ва кредити Pro 100 сатс аст, бо иловаи ҳар гуна бонуси ҳаҷмӣ;
credits мегӯяд, ки ин ҳисоб-фактура чӣ илова мекунад.
Ҷавоб
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"payment_request": "lnbc100u1p5...",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": "2026-09-30T09:27:00Z",
"status": "pending"
}
| Ҳолат | Кай |
|---|---|
400 | Усули дигар дар масир (unsupported_method), асъори номаълум (unsupported_currency) ё сатҳ, маблағи намерасида ё маблағи камтар аз ҳадди ақалл (amount_too_small), аз 1,000,000 sats боло (amount_too_large) ё аз ҷониби қамқалаи Lightning рад карда шуд (amount_out_of_range). |
429 | Беш аз 60 ҳисобнома барои ин nym, ё 120 ҳисобнома аз ин суроға дар як соат (rate_limit_exceeded, бо Retry-After). |
502 | Ҳозир ягон ҳисобнома (инвойс) сохта намешавад (invoice_unavailable, бо Retry-After). |
cURL
curl https://nymbot.ai/api/v1/topup/create/btc-lightning \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"amount": 10000, "currency": "SATS", "tier": "pro"}'
Python
import os
import requests
res = requests.post(
"https://nymbot.ai/api/v1/topup/create/btc-lightning",
headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
json={"amount": 10000, "currency": "SATS", "tier": "pro"},
)
invoice = res.json()
print(invoice["payment_request"])
JavaScript
const res = await fetch("https://nymbot.ai/api/v1/topup/create/btc-lightning", {
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.NYMBOT_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ amount: 10000, currency: "SATS", tier: "pro" }),
});
const invoice = await res.json();
console.log(invoice.payment_request);
Санҷиши шарж
Мепурсад, ки оё ҳисобнома пардохт шудааст ё на ва пас аз он, кредитро илова мекунад. Санҷиш он чизест, ки онро кредит мекунад, бинобар ин пас аз пардохт, то вақте ки ҳолат мешавад, санҷиш кунед creditedБоз аз нав санҷидан
баъд аз он бехатар аст: сармоя танҳо як бор ворид мешавад, новобаста аз он ки шумо чанд маротиба талаб мекунед.
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — ба калид аз nym, ки ҳисобномаро сохтааст, ниёз дорад.
status аст pending (то ҳол пардохт нашудааст), paid (пардохт шудааст, аммо ҳанӯз ба ҳисоб нагузаштааст; дубора санҷед), credited (дар боланси шумо) ё expired (дар вақт пардохт нашудааст). Майдонҳои боломавод барои сатҳе мебошанд, ки фактура онро пур мекунад.
Ҷавоб
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| Ҳолат | Кай |
|---|---|
400 | ID он ID-и 64-символӣ аз даъвати create нест. |
404 | Барои ин ID ҳеҷ як ҳисобнома барои Nym мавҷуд нест (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 рӯз нигоҳ дошта мешаванд, аввал навтаринҳо. Калиди (key) ки ба ҳадди ниҳоии худ расидааст, то ҳол метавонад таърихи худро бинад.
GET https://nymbot.ai/api/v1/queries/history — ба калиди API ниёз дорад, ки дархостҳои худро мебинад, ё... дархости имзошуда аз номи ту, ки ҳамаи калидҳоро мебинад.
| Майдон | Навъ | Лозим аст | Тавсиф |
|---|---|---|---|
page | сохтор (савол) | Не | Дифолт 1, то ҳадди аксар 1,000; саҳифаи баландтар аст 400 invalid_value. |
page_count | сохтор (савол) | Не | Миқдори сатрҳо дар ҳар саҳифа. Дифолт 20, аз ҳама бештар 100. |
start_dateend_date | сатр (дархост) | Не | Санаҳо ё вақтҳои ISO 8601. |
model | сатр (дархост) | Не | Танҳо ин модел. |
type | сатр (дархост) | Не | chat, responses, messages, image, video, speech, transcription ё embedding. |
all_keys | булеан (саволнома) | Не | Бо калид: true ҳамаи калидҳои ҳамон номро дар бар мегирад. Дифолт false. |
key_id | сатр (дархост) | Не | Бо дархости имзошуда, ё бо all_keys=true: танҳо ҳамин калид. |
Ҷавоб
{
"data": [
{
"id": "q_71c4e9a0",
"timestamp": "2026-09-30T08:12:00Z",
"model": "anthropic/claude-sonnet-5",
"type": "chat",
"input_tokens": 1240,
"output_tokens": 380,
"cached_tokens": 0,
"cost_sats": 16.2,
"cost_usd": 0.01895,
"balance": "pro",
"key_id": "4f0c9a1be27d3856",
"web_search": false,
"status": "ok"
}
],
"pagination": { "page": 1, "page_count": 20, "total": 311, "total_pages": 16 }
}
cURL
curl "https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat" \
-H "Authorization: Bearer $NYMBOT_API_KEY"
Python
import os
import requests
res = requests.get(
"https://nymbot.ai/api/v1/queries/history",
headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
params={"page_count": 50, "type": "chat"},
)
for row in res.json()["data"]:
print(row["timestamp"], row["model"], row["cost_sats"])
JavaScript
const res = await fetch("https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat", {
headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
for (const row of (await res.json()).data) console.log(row.timestamp, row.model, row.cost_sats);
Рӯйбанд кардани дархостҳои ҳисоб
Сохтани, тағйир додан ва бекор кардани калидҳо, хулосаи ҳисоб ва иловаи автоматии маблағ калиди API-ро талаб намекунанд. Онҳо имзо аз nym-и шуморо талаб мекунанд, бинобар ин калиди фошшуда метавонад танҳо то сатҳи муайяншуда сарф кунад, аммо ҳеҷ гоҳ наметавонад калиди дигар созад ё сатҳи худро баланд бардорад.
Замима ин корро барои шумо иҷро мекунад: ҳама чиз дар ... API ҷадвал ин нуқтаҳои терминалро истифода мебарад. Шумо танҳо ба ин бахш барои идора кардани калидҳо аз коди худатон ниёз доред.
Имзо як воқеаи Nostr аз навъи 27235 (NIP-98) мебошад, ки бо encoding-и 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, ва бадани шумо, ки мефиристед, бояд байт ба байт ҳамон бошад, ки шумо хеш кардед.created_atбояд дар доираи 60 сонияи соати сервер бошад.- Ҳар як воқеа як бор кор мекунад, а
GETдохил шудааст, бинобар ин сарлавҳаи (header) гирифташуда наметавонад дубора истифода шавад. Барои ҳар як дархост сарлавҳаи навро имзо кунед. Илова кунедnonceтег бо як қимати тасодуфӣ то ду дархост, ки дар як сония имзо шудаанд, боз ҳам аз ҳам фарқ кунанд. - Бадани дархости имзошуда метавонад аз 64 KB зиёд набошад ва бадан лозим аст
Content-Type: application/json.
Воқеаи гумшуда бармегардад 401 missing_nostr_auth; яке, ки бад тасхил шудааст,
бад имзо шудааст, хеле кӯҳна аст, ё барои URL, усул ё бадан (body) дигар аст, баргардонида мешавад
invalid_nostr_auth, бо сабаб дар паём; яке аз навбат истифодааш бурдашуда баргашта мешавад
nostr_auth_replayedКалиди API, ки ба ин нуқтаҳои парвондакунӣ (endpoints) фиристода мешавад, рад карда мешавад.
Имзо пеш аз хондани бадан (body) санҷида мешавад, ва ҳар як суроға метавонад онро 30 маротиба дар як дақиқа гум кунад (суроғаи IPv6 ҳамчун тамоми /64 ҳисоб мешавад); пас аз он он мегирад 429 бо
Retry-After.
Браузерҳо метавонанд ин нуқтаҳои терминалро танҳо аз сайтҳои худи Nymbot дастрас кунанд (https://nymbot.ai,
https://nymchat.app ва зердоменҳои онҳо). Саҳифа дар ҳар як сомонаи дигар заголовҳои CORS-ро намегирад, бинобар ин он наметавонад чӣ чизро онҳо бармегардонад, хонад. Скриптҳо ва барномаҳои нативӣ, ки чизе намефиристанд
Origin, таъсир намепазиранд.
Барои имзо кардан ба калиди махфии nym-и шумо лозим аст (the nsec), ки ҳама чизро назорат мекунад: ҳувияти шумо, таърихи шумо ва баланси шумо. Онро танҳо дар скрипт дар мошине, ки ба он бовар доред, гузоред, онро ба ҷои навиштан дар файл аз муҳити система (environment) бихонед ва ҳар вақте ки имконпазир аст, бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар бар
Ин ёварҳо сарлавҳаро месозанд. Мисолҳои минбаъда дар ин саҳифа аз онҳо истифода мебаранд. Онҳо калиди махфиро дар шакли hex аз NOSTR_SECRET_HEX; он cURL истифода мебарад
наку асбоби сатри фармон, ки калиди nsec ё hex-ро мегирад, ва sha256sum (дар macOS, shasum -a 256).
cURL
nostr_auth() {
method="$1"; url="$2"; body="$3"
nonce=$(openssl rand -hex 16)
if [ -n "$body" ]; then
hash=$(printf '%s' "$body" | sha256sum | cut -d' ' -f1)
event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce" -t "payload=$hash")
else
event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce")
fi
printf 'Nostr %s' "$(printf '%s' "$event" | base64 | tr -d '\n')"
}
Python
# pip install coincurve requests
import base64, hashlib, json, os, time
from coincurve import PrivateKey, PublicKeyXOnly
SECRET = bytes.fromhex(os.environ["NOSTR_SECRET_HEX"])
def nostr_auth(method, url, body=b""):
pubkey = PublicKeyXOnly.from_secret(SECRET).format().hex()
tags = [["u", url], ["method", method], ["nonce", os.urandom(16).hex()]]
if body:
tags.append(["payload", hashlib.sha256(body).hexdigest()])
created_at = int(time.time())
serialized = json.dumps([0, pubkey, created_at, 27235, tags, ""], separators=(",", ":"), ensure_ascii=False)
event_id = hashlib.sha256(serialized.encode()).digest()
event = {
"id": event_id.hex(),
"pubkey": pubkey,
"created_at": created_at,
"kind": 27235,
"tags": tags,
"content": "",
"sig": PrivateKey(SECRET).sign_schnorr(event_id).hex(),
}
return "Nostr " + base64.b64encode(json.dumps(event).encode()).decode()
JavaScript
// npm install nostr-tools
import { createHash, randomBytes } from "node:crypto";
import { finalizeEvent } from "nostr-tools/pure";
const secret = Buffer.from(process.env.NOSTR_SECRET_HEX, "hex");
export function nostrAuth(method, url, body = "") {
const tags = [["u", url], ["method", method], ["nonce", randomBytes(16).toString("hex")]];
if (body) tags.push(["payload", createHash("sha256").update(body).digest("hex")]);
const event = finalizeEvent(
{ kind: 27235, created_at: Math.floor(Date.now() / 1000), tags, content: "" },
secret,
);
return "Nostr " + Buffer.from(JSON.stringify(event)).toString("base64");
}
Хулосаи ҳисоб
Дар қисми болои варақаи API-и барнома чӣ нишон дода шудааст: калиди}?и сиз, ҳарду миқдори маблағ, миқдори калидҳои
фаъол (на бекоршуда ва на ба муҳлат расида), ва пур кардани автоматикӣи маблағ танзимот, ё
null вақте ки сервер онҳоро пешниҳод намекунад.
GET https://nymbot.ai/api/v1/account — лозим аст дархости имзошуда.
Ҷавоб
{
"data": {
"pubkey": "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
"balances": {
"standard": { "credits": 120.4, "sats": 1204 },
"pro": { "credits": 408.33, "sats": 40833 }
},
"keys_active": 3,
"nwc_auto_topup": {
"connected": true, "threshold_sats": 5000, "topup_sats": 20000, "tier": "pro",
"last_topup_at": null, "last_topup_sats": null, "last_error": null
}
}
}
cURL
URL=https://nymbot.ai/api/v1/account
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/account"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/account";
const res = await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } });
console.log(await res.json());
Идора кардани калидҳо
Нуқтаҳои терминалӣ дар паси рӯйхати калидҳои барнома. Ҳамаи онҳо ба ... махбуд дархост. Ҳар як калид ба ин шакл баргардонида мешавад, бо вақтҳо дар ISO 8601 ва маблағҳо бо сатс:
Объекти калидӣ
{
"id": "4f0c9a1be27d3856",
"name": "laptop scripts",
"hint": "sk-nymbot-Qm7x…c2Lw",
"limit_sats": 20000,
"reset_period": "monthly",
"reset_at": "2026-10-01T00:00:00Z",
"expire_at": null,
"period_used_sats": 3412,
"total_used_sats": 18230,
"created_at": "2026-08-14T09:21:07Z",
"updated_at": "2026-09-02T17:40:55Z",
"last_used_at": "2026-09-30T08:12:00Z",
"revoked_at": null
}
hint барои шинохтани калид кофист, вале на барои истифодаи он. Худ калид танҳо як бор, ҳангоми сохта шуданаш, баргардонида мешавад.
Рӯйхати калидҳо
GET https://nymbot.ai/api/v1/keys — имзо шуд.
| Майдон | Навъ | Лозим аст | Тавсиф |
|---|---|---|---|
include_revoked | булеан (саволнома) | Не | Калидҳои ботлӣро дохил кунед. Дифолт false. |
Ҷавоб
{ "data": [ { "id": "4f0c9a1be27d3856", "name": "laptop scripts", "hint": "sk-nymbot-Qm7x…c2Lw", "...": "..." } ] }
cURL
URL=https://nymbot.ai/api/v1/keys
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys"
for key in requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"]:
print(key["id"], key["name"], key["period_used_sats"], key["limit_sats"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys";
const { data } = await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json();
for (const key of data) console.log(key.id, key.name, key.period_used_sats, key.limit_sats);
Сохтани калид
POST https://nymbot.ai/api/v1/keys — имзо шудааст. Возвратҳо 201.
| Майдон | Навъ | Лозим аст | Тавсиф |
|---|---|---|---|
name | сатр | Бале | аз 1 то 40 аломат, аз дигар калидҳои фаъоли шумо фарқ кунад (бе назар гирифтани ҳарфҳои калон ва хурд). |
limit_sats | адади бутун | Не | Садри маблағ дар сатс, ҳадди ақал 1. Барои бе садри маблағ холиаш гузоред. |
reset_period | сатр | Не | daily, weekly ё monthlyЭҳтиёҷот limit_satsИнро барои кулоҳе, ки ҳеҷ гоҳ аз нав (reset) намешавад, берун гузоред. |
expire_at | сатр ё адади бутун | Не | Вақте ки калид кор намекунад: вақти ISO 8601 ё миллисекундҳо аз соли 1970. |
Ҷавоб (201)
{
"data": {
"id": "4f0c9a1be27d3856",
"name": "laptop scripts",
"hint": "sk-nymbot-Qm7x…c2Lw",
"limit_sats": 20000,
"reset_period": "monthly",
"key": "sk-nymbot-Qm7x...c2Lw",
"...": "the rest of the key object"
}
}
| Ҳолат | Кай |
|---|---|
400 | Номи гумшуда ё хеле дароз; номе, ки аллакай истифода мешавад (duplicate_name); сарфи (cap), ки адади бутун нест ва камаш 1 аст; давраи аз нав оғоз шудан (reset period) бидуни сарф; муҳлати баъд аз гузаштан; майдони номаълум (unknown_parameter); ё 25 калиди фаъол аллакай (too_many_keys). |
429 | Беш аз 60 калид аз ҷониби ин nym сохта шудааст, ё 120 аз ин суроға, дар як соат (rate_limit_exceeded, бо Retry-After). |
cURL
URL=https://nymbot.ai/api/v1/keys
BODY='{"name":"laptop scripts","limit_sats":20000,"reset_period":"monthly"}'
curl "$URL" \
-H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json
import requests
url = "https://nymbot.ai/api/v1/keys"
body = json.dumps({"name": "laptop scripts", "limit_sats": 20000, "reset_period": "monthly"}).encode()
res = requests.post(
url,
data=body,
headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"]["key"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys";
const body = JSON.stringify({ name: "laptop scripts", limit_sats: 20000, reset_period: "monthly" });
const res = await fetch(url, {
method: "POST",
headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
body,
});
console.log((await res.json()).data.key);
Хондани як калид
GET https://nymbot.ai/api/v1/keys/{id} — имзо шуд.
Баргардишҳо {"data": {…}} бо объекти калид, ё 404
key_not_found агар ягон калиди шумо ин ID-ро надошта бошад.
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
console.log((await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json()).data);
Иваз кардани калид
PATCH https://nymbot.ai/api/v1/keys/{id} — имзо шуд.
Ҳар кадоме аз name, limit_sats, reset_period ва
expire_at, бо ҳамон қоидаҳое, ки ҳангоми сохтани калид истифода мешаванд. null бе маҳдудият, бе барнард (reset), бе муҳлат. Тағйир додани давраи барнард давраи навро аз сифр оғоз мекунад.
Калиди ботилшударо тағйир додан мумкин нест (400 key_revoked). Баргардондаҳо
{"data": {…}} бо объекти калиди навшуда.
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
BODY='{"limit_sats":50000,"expire_at":null}'
curl -X PATCH "$URL" \
-H "Authorization: $(nostr_auth PATCH "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
body = json.dumps({"limit_sats": 50000, "expire_at": None}).encode()
res = requests.patch(
url,
data=body,
headers={"Authorization": nostr_auth("PATCH", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const body = JSON.stringify({ limit_sats: 50000, expire_at: null });
const res = await fetch(url, {
method: "PATCH",
headers: { "Authorization": nostrAuth("PATCH", url, body), "Content-Type": "application/json" },
body,
});
console.log((await res.json()).data);
Лағв кардани калид
DELETE https://nymbot.ai/api/v1/keys/{id} — имзо шуд.
Калидро фавран ва ҳаз{%? no, wait, the translation for "for good" in this context is "ба таври доимӣ/ҳаме"。
"Stops the key at once, for good. It stays in the list with"
"Калидро фавран ва ба таври доимӣ боз медорад. Он дар рӯйхат бо ... мемонад."
Let's refine:
"Stops the key at once, for good." -> "Калидро фавран ва ҳамеша боз медорад."
"It stays in the list with" -> "Он дар рӯйхат бо ... мемонад."
Final translation:
Калидро фавран ва ҳамеша боз медорад. Он дар рӯйхат бо revoked_at гузошта мешавад, ва метавон
бо ... дид include_revoked=true. Бекор кардани калиде, ки аллакай бекор шудааст, ҳамон тавр ҷавоб медиҳад. Танҳо 50 калиди бекораки охирин нигоҳ дошта мешаванд; калидҳои кӯҳна вақте ки калиди дигар бекор мешавад, нест карда мешаванд.
Ҷавоб
{ "data": { "id": "4f0c9a1be27d3856", "revoked": true } }
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());
Пур кардани автоматии NWC
Пайваст кунед кошени Lightning-ро бо Nostr Wallet Connect ва Nymbot та балансро худаш пур мекунад, вақте ки хароҷоти API онро кам мекунад. Варақаи API-и барнома ҳамон танзимотро дорад; инҳо нуқтаҳои терминалҳои (endpoints) пасти он мебошанд. Ҳамаи онҳо ба ... ниёз доранд дархости имзошуда.
Ин чӣ тавр кор мекунад: пас аз он ки барои дархости API аз ҳосуби интихобкардаи шумо маблағ квист, агар он ҳосуб аз ҳадафи муайяншудаи шумо паст шавад, Nymbot барои маблағи иловакунии шумо ҳисоб-китоб (инвойс) омода мекунад, аз косаи шумо (wallet) талаб мекунад, ки онро пардохт кунад ва маблағро илова мекунад. Он ҳар 5 дақиқа як бор барои ҳар nym ва ҳосуб маблағ илова мекунад, бинобар ин зиёдшавии якбораи дархостҳо наметавонад маблағи косаро тамом кунад. Хароҷоти дар барномаҳо ин равандро фаъол намекунад. Вақт ва ҳаҷми охирин иловакунии маблағ, инчунин охирин хатогӣ дар танзимот мавҷуданд; агар пардохт пас аз хатогӣ иҷро шуда бошад, санҷиши ҳисоб-китоби он бо ҳолати пуликунӣ кредитҳо.
Сарти пайвастшавӣ (connection string) иҷозат медиҳад, ки ҳар кӣ онро дорад, аз косаи пули (wallet) шумо талаби пардохт кунад. Nymbot
онро ба таври маҳфиятшуда захира мекунад ва танҳо барои пардохти ҳисобномаҳои (invoices) тўп-ап-и худ истифода мебарад, аммо танҳо барои ҳамин
як пайвастшавӣ эҷод кунед, ки дар косаи пули шумо буҷаи сарфкунӣ дошта бошад, то ҳадди аксари маблаге, ки метавонад пардохт кунад, рақаме бошад, ки шумо интихоб кардед. Косаи пул бояд дастгирӣ кунад pay_invoice.
Пайваст кардани кошелл
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — имзо шуд.
| Майдон | Навъ | Лозим аст | Тавсиф |
|---|---|---|---|
nwc_url | сатр | Бале | Сатри пайвастшавӣ, ки оғоз мешавад nostr+walletconnect://. Nymbot аз ҳамён талаб мекунад, ки get_info пеш аз захира кардани он, ва онро ба таври шифршуда нигоҳ медорад. |
threshold_sats | адади бутун | Бале | Танзим кунед, вақте ки маблағ аз ин миқдор сатс кам мешавад. Ҳадди ақал 1,000. |
topup_sats | адади бутун | Бале | Ҳар дафъа чӣ қадар илова кунам. аз 1,000 то 1,000,000 sats. |
tier | сатр | Не | pro (дифолтӣ) ё standardбалансе, ки бояд назар кунед ва туррат (топ-ап) кунед. |
Ҷавоб
{
"data": {
"connected": true,
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
"last_topup_at": null,
"last_topup_sats": null,
"last_error": null
}
}
| Ҳолат | Кай |
|---|---|
400 | На хатти пайвастшавӣ (invalid_nwc_url); кошена тавассути релеи худ посух надид (nwc_unreachable) ё санҷидро рад кард (nwc_rejected); пайвастшавӣ наметавонад ҳисобфактураҳоро пардохт кунад (nwc_missing_permission); ё маблағи берун аз маҳдудиятҳо. |
501 | Иловакунии худкор барои ин сервер фаъол карда нашудааст (nwc_unavailable). Ҳамин тавр ба ду нуқтаи дигар низ тааллуқ дорад. |
cURL
URL=https://nymbot.ai/api/v1/nwc-auto-topup/connect
BODY='{"nwc_url":"nostr+walletconnect://...","threshold_sats":5000,"topup_sats":20000,"tier":"pro"}'
curl "$URL" \
-H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json, os
import requests
url = "https://nymbot.ai/api/v1/nwc-auto-topup/connect"
body = json.dumps({
"nwc_url": os.environ["NWC_URL"],
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
}).encode()
res = requests.post(
url,
data=body,
headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json())
JavaScript
const url = "https://nymbot.ai/api/v1/nwc-auto-topup/connect";
const body = JSON.stringify({
nwc_url: process.env.NWC_URL,
threshold_sats: 5000,
topup_sats: 20000,
tier: "pro",
});
const res = await fetch(url, {
method: "POST",
headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
body,
});
console.log(await res.json());
Хондани танзимот
GET https://nymbot.ai/api/v1/nwc-auto-topup — имзо шуд.
Ҳамон объектро, ки аз пайвастшавӣ ба даст меояд, бармегардонад, бо connected: false ва соҳаҳои дигар
null вақте ки ягон кошета пайваст нест. Худи сатри пайвастшавӣ ҳеҷ гоҳ
баргардонида намешавад.
cURL
URL=https://nymbot.ai/api/v1/nwc-auto-topup
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/nwc-auto-topup"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/nwc-auto-topup";
console.log(await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json());
Дар ҳоли ҷудо шудан
DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection — имзо шуд.
Сарти пайвастшавии захирашударо нест мекунад. Танзимҳои нав дигар иҷро намешаванд. Барои боварӣ ҳосил кардан, шумо метавонед пайвастшавиро дар косаи (wallet) худ низ бекор кунед.
Ҷавоб
{ "data": { "connected": false, "threshold_sats": null, "topup_sats": null, "tier": null, "last_topup_at": null, "last_topup_sats": null, "last_error": null } }
cURL
URL=https://nymbot.ai/api/v1/nwc-auto-topup/connection
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/nwc-auto-topup/connection"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/nwc-auto-topup/connection";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());
Пардохт барои ҳар як дархост бидуни калид
Нуқтаҳои терминалҳои бо нархи муайяншударо метавон барои як дархост дар як вақт тавассути Lightning пардохт кард, бидуни калид,
бидуни ҳисоб ва бидуни маблағ: POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations ва POST /embeddingsЧатҳо, посухҳо ва
Паёмҳо ҳамеша ба калид ниёз доранд. Дархосте, ки калид дорад, ҳамчун маъмул аз миёни маблағ ба ҳисоб гирифта мешавад;
раванди пардохт танҳо вақте оғоз мешавад, ки калид фиристода нашавад.
Nymbot ду версияи як ғояро аз як бэкэнд гуфтан: Lightning Labs'
L402 (инчунин бо номи қадимӣ қабул мешавад, LSAT) ва лоиҳаи IETF
Пардохт Схемаи аутентификатсияи HTTP бо lightning метод ва
charge ноният. Ҳар кадомеро, ки муштарӣ касбад, истифода баред.
Пардохт бидуни калид танҳо дар ҳолати зерин имконпазир аст API_L402_SECRET камаш 32 байт рандомӣ дорад, ҳамчун hex (64 адад) ё base64 (44). Якто бо насб кунед openssl rand -hex 32Қимати кӯтоҳтар ё қобили тахмин функсияро хомӯш мекунад ва сабабашро сабт менамояд. Барои иваз кардани он, қимати кӯҳиро ба API_L402_SECRET_PREVIOUS барои як рӯз: маълумоти воридшавӣ, URL-ҳои ҳолат ва
мушкилотҳое, ки дар зери он сохта шудаанд, то вақти бартараф шудани онҳо кор мекунанд.
Челленҷ
Замимаро бидуни ягон чиз фиристед Authorization сарлавҳа. Агар он дуруст бошад, ҳеҷ чиз иҷро намешавад ва
шумо мегиред 402 Payment Required бо ҳисобнома барои маблағи дақиқи он дархост:
нархи ҳамон, ки калид месупорад, табдилдодашуда ба 10 sats барои як кредити стандартӣ ё 100 sats барои як кредити Pro
ва ба як сати пурра бояд ба боло раунд шавад (каман 1 sat, ва каман минимуми 0.05 кредит).
ҷавоб се ... меорад WWW-Authenticate мушкилоти барои ҳамон фактура:
HTTP/1.1 402 Payment Required
Content-Type: application/problem+json; charset=utf-8
Cache-Control: no-store
WWW-Authenticate: L402 macaroon="AgJC...", invoice="lnbc2370n1..."
WWW-Authenticate: LSAT macaroon="AgJC...", invoice="lnbc2370n1..."
WWW-Authenticate: Payment id="kM9x...", realm="nymbot", method="lightning", intent="charge",
request="eyJhbW91bnQiOiIyMzciLC...", description="Nymbot API POST /images/generations (237 sats)",
digest="sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:", expires="2026-09-30T12:15:00.000Z",
opaque="eyJlbmRwb2ludCI6IlBPU1QgL2ltYWdlcy9nZW5lcmF0aW9ucyJ9"
{
"type": "https://paymentauth.org/problems/payment-required",
"title": "Payment Required",
"status": 402,
"detail": "This request costs 237 sats. Pay the Lightning invoice, then send the identical request again ...",
"challengeId": "kM9x...",
"amount_sats": 237,
"invoice": "lnbc2370n1...",
"payment_hash": "9db1370f...",
"expires_at": "2026-09-30T12:15:00.000Z",
"error": { "message": "This request costs 237 sats. ...", "type": "payment_required", "code": "payment_required", "param": null }
}
Пардохт request параметр JSON-и base64url аст:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
Мушкил ба нуқтаи ниҳоят банд аст, ба Content-Type (навъи медиа ва, барои
multipart, ҳудиди он) ва ба SHA-256 байтҳои дақиқи бадани фиристодашуда, ва 15
дақиқа давом мекунад. Пас аз пардохт, фиристед якхела дубора дархост: ҳамон
Content-Type ва ҳамон байтҳои JSON, ё барои endpoint-ҳои multipart
(/images/edits, /audio/transcriptions, /audio/translations)
ҳодисаи баданҳои бисёрқисмати ягона бо ҳамон сарди (boundary) якхела. Аксари китобхонаҳои HTTP ҳар дафъае, ки формаро рамзгузорӣ мекунанд, сарди навро интихоб мекунанд, пас онро як бор рамзгузорӣ карда, ҳамон байтҳоро ду бор фиристед.
Ҳар як суроға метавонад дар як дақиқа 30 дархости санҷиш (challenge) диҳад (суроғаи IPv6 ҳамчун тамоми /64 ҳисоб мешавад). Дархостҳое, ки суроғаи онҳо номаълум аст, лимити шадидтари 10 дар дақиқаро мувассал мешаванд ва барои санҷишҳое, ки Nymbot дар тамоми суроғаҳо иҷро мекунад, маҳдудияти умумӣ мавҷуд аст; дархосте, ки пеш аз иҷрои санҷиш рад карда мешавад (масалан, бо бадани ғайриҷории JSON), ба ин ҳисоб дохил намешавад. Пас аз он ҷавоб ин аст 429 бо Retry-After, пеш аз хондани бадан фиристода мешавад. Нуқтаҳои ниҳояи (endpoints) пардохтшуда, ки бидуни калид ё маълумоти тасдиқкунанда (credential) даъват карда шудаанд, инчунин ба лимити умумии 120 дарзвисти бетасдиқшуда дар як дақиқа барои ҳар як суроға дохил мешаванд. Маълумоти тасдиқкунанда пеш аз хондани бадан санҷида мешавад ва дарзвисте, ки Content-Type нест application/json (ё
multipart/form-data барои боргузорӣ) бо ... рад карда мешавад 415 ва ҳеҷ гоҳ
ҳисобнома намегирад.
Нархгузории Embeddings аз тахмини токенҳои дар воридот мавҷудбуда бо ҳисоби 1.5× маржа иҷро мешавад, зеро шумораи воқеӣ танҳо пас аз он маълум мегардад. Шумо барои токенҳои воқеан истифодашуда пардохт мекунед ва қисми истифоданашудаи пардохт ҳамчун ... баргардонида мешавад қай возврати токен.
Ирсоли пардохт
Ҳисобномаро бо ҳар як коши Lightning пардохт кунед. Кош ба шумо preimage-ро медиҳад, ки аз 64 ҳарфи hex иборат аст. Сипас ҳамон дархостро бо яке аз инҳо фиристед:
| Нақша | Сарлавҳа |
|---|---|
| L402 | Authorization: L402 <macaroon>:<preimage> (LSAT кор мекунад) |
| Пардохт | Authorization: Payment <base64url JSON>, ки JSON дар куҷост {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}} |
Фармоиши пулакӣ маҳз мисли дархости сохташуда бо калид ҷавоб медиҳад, бо ин фарқ, ки nymbot
объект дорои майдонҳои баланс нест: {"payment": "l402", "tier": "pro", "paid_sats": 237,
"charged_sats": 237}, ва ҳеҷ чиз нест X-Nymbot-Balance-Sats сарлавҳа. Дархосте, ки бо нақшаи пардохт пардохт шудааст, инчунин ... мегирад Payment-Receipt сарлавҳа (base64url
JSON бо ID-и чолленҷ, хеши пардохт ҳамчун reference, status ва
timestamp). Дархостҳои пардохтшуда ба ягон nym пайваст нестанд, бинобар ин онҳо дар таърихи пурсишҳо намоён намешаванд.
| Ҳолат | Кай |
|---|---|
402 payment_already_used | Ҳар як пардохт барои як дархост пардохт карда мешавад. Ҷавоб барои ин дархост як чолизи нави нав аст, бинобар ин мизоне, ки охирин маълумоти тасдиқкунандаи худро кэш мекунад (ҳамчун lnget танҳо дубора пардохт мекунад. |
402 payment_mismatch | Ҳуҷҷати тасдиқ барои нуқтаи терминалӣ (endpoint) дигар дода шудааст, Content-Type ё бадан, ё ҳоло пардохт аз ин дархост камтар аст. Бо ин дархост як чолизи наздики дигар омадааст; агар пардохт хеле хурд буд, он чизе ки шумо пардохт кардед ҳамчун ... баргард мегардад қай возврати токен (refund_token ва refund_sats дар бадан). |
402 payment_expired | Аз аввали чолленҷ беш аз 15 дақиқа гузашт. Бо он як чолленҷи нав меояд. Агар преобраз нишон диҳад, ки шумо пардохт кардед, он чизе, ки шумо пардохт кардед, ҳамчун... қай возврати токен (refund_token ва refund_sats дар бадан), як бор; сипас маълумоти воридсозӣ сарф мешавад. |
401 invalid_preimage | Пешсорат ба хеши пардохти ҳисобнома хеш намекунад. Пардохт истифода нашудааст. |
401 invalid_payment_credential | Ҳуҷҷати тасдиқ нодуруст аст, пас аз он ки Nymbot онро додааст, тағйир ёфтааст, ё ба хеши пардохте ишора мекунад, ки Nymbot ҳеҷ гоҳ барои он фактура нагузоштааст. Макарон бо эзоз (caveat), ки Nymbot онро намешиносад, ё бо эзозҳои зиддидигар, рад карда мешавад. |
429 rate_limit_exceeded | Беш аз 30 маълумоти тасдиқ ё калидҳое, ки тасдиқ нашуданд, аз ин суроға дар як дақиқа омаданд, ё як токени баргардонидан беш аз 60 маротиба дар як дақиқа фиристода шуд. Мунтазир бошед барои Retry-After. |
cURL
BODY='{"model":"nano-banana","prompt":"a lighthouse at dusk","response_format":"b64_json"}'
URL=https://nymbot.ai/api/v1/images/generations
# 1. Get the challenge
CH=$(curl -s -D - -o /dev/null "$URL" -H "Content-Type: application/json" -d "$BODY" | grep -i '^www-authenticate: L402')
MAC=$(echo "$CH" | sed -E 's/.*macaroon="([^"]+)".*/\1/')
INVOICE=$(echo "$CH" | sed -E 's/.*invoice="([^"]+)".*/\1/')
# 2. Pay $INVOICE with your wallet and copy the preimage
PREIMAGE=...
# 3. Send the identical request with the credential
curl "$URL" -H "Content-Type: application/json" -H "Authorization: L402 $MAC:$PREIMAGE" -d "$BODY"
lnget
# lnget (Lightning Labs) pays L402 challenges from your own lnd node and retries for you
lnget -X POST -H "Content-Type: application/json" \
-d '{"model":"nano-banana","prompt":"a lighthouse at dusk","response_format":"b64_json"}' \
https://nymbot.ai/api/v1/images/generations
Python
import base64, json, re
import requests
url = "https://nymbot.ai/api/v1/images/generations"
body = json.dumps({"model": "nano-banana", "prompt": "a lighthouse at dusk", "response_format": "b64_json"}).encode()
headers = {"Content-Type": "application/json"}
challenge = requests.post(url, data=body, headers=headers)
assert challenge.status_code == 402
info = challenge.json()
print("Pay", info["amount_sats"], "sats:", info["invoice"])
preimage = pay_with_your_wallet(info["invoice"]) # 64 hex characters
# L402
mac = re.search(r'L402 macaroon="([^"]+)"', challenge.headers["WWW-Authenticate"]).group(1)
res = requests.post(url, data=body, headers={**headers, "Authorization": f"L402 {mac}:{preimage}"})
print(res.json()["nymbot"])
JavaScript
const url = "https://nymbot.ai/api/v1/images/generations";
const body = JSON.stringify({ model: "nano-banana", prompt: "a lighthouse at dusk", response_format: "b64_json" });
const headers = { "Content-Type": "application/json" };
const challenge = await fetch(url, { method: "POST", headers, body });
const www = challenge.headers.get("www-authenticate");
// The Payment scheme: echo every challenge parameter back with the preimage
const start = www.indexOf("Payment ");
const params = Object.fromEntries([...www.slice(start + 8).matchAll(/(\w+)="((?:[^"\\]|\\.)*)"/g)].map((m) => [m[1], m[2]]));
const { invoice } = JSON.parse(Buffer.from(params.request, "base64url").toString()).methodDetails;
const preimage = await payWithYourWallet(invoice);
const credential = Buffer.from(JSON.stringify({ challenge: params, payload: { preimage } })).toString("base64url");
const res = await fetch(url, { method: "POST", headers: { ...headers, Authorization: `Payment ${credential}` }, body });
console.log((await res.json()).nymbot, res.headers.get("payment-receipt"));
Мизоҷон дар асоси mppx бо усули Lightning худи онҳо мушкили пардохтро ҳал кунанд; онҳоро ба нуқтаи терминал (endpoint) равона кунед ва бигузоред, ки пардохт кунанд.
Видеоҳо
Пардохтшуда POST /videos ҷавобҳо 202 мисли калиддор, ва як
status_url: GET он бе ягон калид барои иҷрои кор,
он имзо шудааст
ва 24 соат кор мекунад, то даме ки кор нигоҳ дошта шавад.
{
"id": "vid_...",
"status": "in_progress",
"status_url": "https://nymbot.ai/api/v1/videos/vid_...?exp=1790000000&sig=...",
"nymbot": {
"payment": "l402", "tier": "pro", "paid_sats": 4800, "charged_sats": 4800,
"refund_token": "REFUND-5E0B..."
}
}
Нигоҳ дор refund_token аз ин ҷавоб: он танҳо дар ин ҷо нишон дода мешавад. Ҳангоми коркарди видео холӣ аст (GET /api/v1/l402/refunds ҷавобҳо "status": "pending");
агар рендеринг бепардохт (unbilled) хато кунад, пардохт ба он меафтад. URL-и ҳолат нишон медиҳад
refund_sats барои кори баргардонидашуда, вале токенро нагирифта, бинобар ин, мубодилаи URL-и ҳолат маълумотро дар бораи баргардонидан пешниҳод намекунад. Санҷидани токен инчунин кори нобарорро, ки ҳеҷ кас санҷӣ накардааст, ҳал мекунад.
Баргардони маблағҳо
Агар дархости пулакӣ нобарор шавад ва провайдер барои кӯшиш аз Nymbot маблағро ҳисоб кунад, маблағ нигоҳ дошта мешавад ва
хатогӣ инро мегӯяд, бо charged_sats, маҳз ҳамон тавре ки барои дархости калидӣ аст. Агар он
бе пардохт шудан хатогӣ диҳад, хатогӣ дорои қай возврати токен арзиши он чизе, ки шумо пардохт кардед:
{
"error": {
"message": "The image generator failed. Nothing was charged. Please try again. The 237 sats you paid are on refund token REFUND-...",
"type": "api_error",
"code": "upstream_error",
"refund_token": "REFUND-0C15DBED145D59131BA70298A413ADEB3D9B9AB082C476EA70A5BD38FCA5DE6D",
"refund_sats": 237,
"refund_expires_at": "2026-10-30T12:00:00.000Z"
}
}
Қисмҳои истифоданашуда ҳамон тавр бармегарданд: агар шумо ду акс талаб карда бошед ва яке бидуни ҳисоб нобарор шуда бошад, ҷавоби муваффақият... nymbot объект барои он китоби гумшуда токени ивазкунанда (refund token) дорад;
транскрипсияе, ки давоаш дар аввал хонда нашудааст, бо нархи дарозтарин эҳтимолии файл (ҳеҷ гоҳ бештар аз 30 дақиқа) арзёбӣ мешавад, ва фарқияти он бо давоми воқеӣ ҳамчун токени ивазкунанда баргардонида мешавад; агар маълум шавад, ки он аз 30 дақиқа дарозтар аст, он бо ... рад карда мешавад 413
ва тамоми пардохт бармегардад. Эмбеддингҳо он чизеро барمیёранд, ки тахмин нишон надод. Видеои нокамратут асос ба токенӣ, ки дар супориданаш баргашта буд, баргашт карда мешавад.
Токени истрдӯшӣ коди тасодуфии 256-биттӣ мебошад. Nymbot танҳо хеши онро нигоҳ медорад ва он пас аз 30 рӯз эътиборро гум мекунад. Он ҳолати сат-ро нигоҳ медорад ва шумо метавонед:
- Бо он пардохт кунед. Фиристодан
Authorization: Bearer REFUND-…дар ҳар кадоме аз нуқтаҳоиҳои андозагии боло (SDK-и OpenAI онро ҳамчун калиди API-и худ қабул мекунад). Нарх аз токен бароварда мешавад ва он чизе, ки боқӣ мемонад, дар он мемонад (refund_token_satsдарnymbotобъект). Токен, ки арзиши он аз ҷавобҳои дархост камтар аст402refund_insufficient; номуваффақияти пардохт нашуда сатҳоро ба ҳамон токен бармегардонад. - Сандашро санҷед.
GET /api/v1/l402/refundsбо ҳамон сарлавҳа баргардонда мешавад{"sats": 237, "status": "open", "expires_at": "..."}. - Як токенро метавон дар як дақиқа на бештар 60 маротиба истифода бурд.
- Инро ба як ном гузаронед. Онро ба дохили ... гузоред Тӯҳфаро иваз кунед дар
за application-и Nymbot, ё занг занед
POST /api/v1/l402/refunds/redeemбо а дархости имзошуда ва{"refund_token": "REFUND-...", "balance": "standard"}(ё"pro"Ҳамаи кредитҳо ба тавозун мераванд (10 sats ҳар як дар стандартӣ, 100 дар Pro); sats, ки кредитҳои пурра намесозанд, барои дархостҳои 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 } }