База ведаў распрацоўшчыкі
Баланс, топ-ups і ключы
Праверыць, што ў вас ёсць, надрукаваць Lightning, надрукаваць аўтаматычна з вашага уласнага кошачка, паглядзець, што кошт кожнага патрабавання, і кіраваць ключамі з кода.
Для зручнасці гэтая старонка перакладзена машынай. Прымяняецца англійская арыгінал.
Праверка балансу
Як вашы балансы, і як шмат з капусты гэтага ключа выкарыстоўваецца.
GET https://nymbot.ai/api/v1/credits/balance — Вам патрэбны ключ API. POST Працуе і для тых, хто гэта чакае.
balance з'яўляецца два балансы разам у доларах па цяперашняй цэне Bitcoin, для інструментаў, якія чакаюць адну колькасць (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);
Способы выплаты
Узнікае пытанне: калі іх ведае увесь свет, ці можна назваць іх няўдачнікамі?
GET https://nymbot.ai/api/v1/topup/payment-methods Ключа не патрэбны.
А top-up з'яўляецца 10 да 1 000 000 sats; Pro top-up павінна купіць не менш за адзін Pro-крэдыт, так што ён пачынаецца з 100 sats. bulk_bonus вылічвае дадатковы крэдыт на большых топ-упаў, такі ж, як у прыкладзе: 10%, 15% або 20% больш на стандартных топ-упаў з 500, 1000 або 5000 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);
Вынікі пошуку - top over lightning
Запрашаем усіх, хто цікавіцца беларускай гісторыяй, наведаць нашу Бібліятэку. Праверыць гэта Для таго, каб атрымаць крэдыт.
POST https://nymbot.ai/api/v1/topup/create/btc-lightning — Вам патрэбны ключ API.
| Поле | Тып | патрабавана | Опис |
|---|---|---|---|
amount | нумар | так | Як шмат, на currencyУсяго за кошт закупкі. |
currency | Стрынг | Не | SATS (У тым жа выпадку, USD або BTCДолары канвертуюцца па цяперашняй цэне Bitcoin. |
tier | Стрынг | Не | pro (Пасля перамогі) або standard• у якім становішчы знаходзіцца крэдыт. |
Стандартны крэдыт 10 sats і Pro крэдыт 100 sats, плюс любы буйны бонус;
credits Кажуць, што гэта дае дадатковае значэнне.
адказ
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"payment_request": "lnbc100u1p5...",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": "2026-09-30T09:27:00Z",
"status": "pending"
}
| Статус | Калі |
|---|---|
400 | Іншы шлях у шляху (unsupported_method), невядомая валюта (unsupported_currency(або звыш, або звыш, або звыш, або звыш, або звыш, або звыш, або звыш)amount_too_small), больш за 1 000 000 sats (amount_too_large) або адказаў на Lightning портфель (amount_out_of_range). |
429 | Больш за 60 рахункаў для гэтага німа, або 120 з гэтай адрасы, за гадзіну (rate_limit_exceededІ з Retry-After). |
502 | Не магу сказаць, што ўжо вельмі засмучаная.)invoice_unavailableІ з Retry-After). |
cURL
curl https://nymbot.ai/api/v1/topup/create/btc-lightning \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"amount": 10000, "currency": "SATS", "tier": "pro"}'
Python
import os
import requests
res = requests.post(
"https://nymbot.ai/api/v1/topup/create/btc-lightning",
headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
json={"amount": 10000, "currency": "SATS", "tier": "pro"},
)
invoice = res.json()
print(invoice["payment_request"])
JavaScript
const res = await fetch("https://nymbot.ai/api/v1/topup/create/btc-lightning", {
method: "POST",
headers: {
"Authorization": "Bearer " + process.env.NYMBOT_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({ amount: 10000, currency: "SATS", tier: "pro" }),
});
const invoice = await res.json();
console.log(invoice.payment_request);
Загрузіць Top-up
Пытанне: Ці можа пасажыр трапіць у Кітай у міжнародным аэрапорце Гуанчжоу Байюнь, а потым пакінуць Xinumx на ўсходнім чыгуначным вакзале? creditedТрэба звярнуць увагу на тое, што для свідравін выкарыстоўваюць больш магутныя – свідравіны помпы, а для калодзежаў – погружные.
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — трэба ключ з нім, які зрабіў рахунак.
status І pending (Ніколі не заплаціў за гэта) paid (Плаціць, але не зарэгістравана; праверыць яшчэ раз), credited (На вашым рахунку) або expired (Ніякіх падставаў для грамадскіх хваляванняў ці рэнесансу) — гэта рэнесанс, які мы прапануем.
адказ
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| Статус | Калі |
|---|---|
400 | Ідэнт не з'яўляецца 64-значным ідэнтам з выкліку стварэння. |
404 | Ніякіх звестак пра тое, што вы не ведаеце (invoice_not_found). |
cURL
curl https://nymbot.ai/api/v1/topup/status/$INVOICE_ID \
-H "Authorization: Bearer $NYMBOT_API_KEY"
Python
import os, time
import requests
headers = {"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]}
url = "https://nymbot.ai/api/v1/topup/status/" + invoice["invoice_id"]
while True:
status = requests.get(url, headers=headers).json()["status"]
if status in ("credited", "expired"):
break
time.sleep(3)
print(status)
JavaScript
const headers = { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY };
const url = "https://nymbot.ai/api/v1/topup/status/" + invoice.invoice_id;
let status;
do {
await new Promise((r) => setTimeout(r, 3000));
status = (await (await fetch(url, { headers })).json()).status;
} while (status !== "credited" && status !== "expired");
console.log(status);
Хочаш гісторыю
Адзін рад на запыт: што гэта было, якая мадэль, колькі токенаў і што гэта коштала. Нікакіх памочнікаў або адказаў не захоўваюцца, так што ніякіх не вяртаюцца. Рады захоўваюцца на 90 дзён, найноўшы першы.
GET https://nymbot.ai/api/v1/queries/history — патрэбны ключ API, які бачыць свае запрашэнні, або Заяву падпісаў З вашага німа, які бачыць кожны ключ.
| Поле | Тып | патрабавана | Опис |
|---|---|---|---|
page | Асноўны артыкул (query) | Не | Падрабязнасці 1 — не больш за 1000; верхняя старонка 400 invalid_value. |
page_count | Асноўны артыкул (query) | Не | Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: |
start_dateend_date | Сцягнуць (Query | Не | ISO 8601 Дата і час. |
model | Сцягнуць (Query | Не | Толькі гэтая мадэль. |
type | Сцягнуць (Query | Не | chat, responses, messages, image, video, speech, transcription або embedding. |
all_keys | Бульбэра (англ.: Boolean Query) | Не | І ў ключы: true У кожнай з іх з'явіліся новыя кватэры, кватэры, джынсы. false. |
key_id | Сцягнуць (Query | Не | Заявы і абмоўкі пра абмежаванне адказнасці 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);
Заявы на рахункі
Стварэнне, змяненне і аднаўленне клавіш, агляд рахункаў і аўтаматычныя топ-ups не прымаюць клавіш API. Яны прымаюць падпіс ад вашага німа, так што прапушчаны клавіш можа траціць да яго капусты, але ніколі не можа зрабіць іншы клавіш або павысіць свой уласны капусты.
Аппарат робіць гэта для вас: усё ў яго Пажар Усё, што вам трэба зрабіць, гэта проста адзначце файлы, і вы ўсё бяспечна.
Падпісанне з'яўляецца падзеяй Nostr тыпу 27235 (NIP-98), накіраванай base64 у
Authorization Header з словам Nostr На першым месцы:
Гэтая падзея
{
"kind": 27235,
"created_at": 1790726400,
"tags": [
["u", "https://nymbot.ai/api/v1/keys"],
["method", "POST"],
["nonce", "9c4e21f07a3b...16 random bytes in hex"],
["payload", "3f1a0d7c8e2b...sha256 of the exact request body in hex"]
],
"content": "",
"pubkey": "your public key in hex",
"id": "...",
"sig": "..."
}
uУсё, што вы чулі пра карысць пара раней - усяго толькі чуткі і павер'і.methodГэта HTTP метод.payloadГэта SHA-256 групы сыравага патрабавання, у гекса.POSTіPATCHУсё, што вы робіце, — гэта тое, што вы робіце, — гэта тое, што вы робіце.created_atПрацягласць работы паслугі складае 60 секунд ад часу сервера.- Кожнае выданне працуе раз, а
GETУсё, што вы чулі пра карысць пара раней - усяго толькі чуткі і павер'і.nonceУсяго за дзень можна выпіць 1 літр соку без уліку колькасці вады. - Тэмпература ў гэтай (малюпасенькай!) кропцы дасягае дзесяткаў тысяч градусаў, хоць у любым іншым месцы цела тэрмометр пакажа норму.
Content-Type: application/json.
Вынікі пошуку - missing event returns 401 missing_nostr_auth— тое, што няправільна сфарміравана, няправільна падпісана, занадта старая, або для іншага URL, метаду або цела вяртае
invalid_nostr_authНаступным крокам з'яўляецца выбар адпаведнага абсталявання для
nostr_auth_replayedПадпіс прачытаецца, перш чым цела будзе прачытана, і кожны адрас можа няправільна прачытаць яго 30 раз у хвіліну (адрас IPv6 лічыцца як яго ўвесь /64); пасля таго ён атрымае 429 з
Retry-After.
Папярэдні Тэкст Наступны Тэкст Наступны Тэкст Наступны Тэкст Наступны Тэкст Наступны Тэкст (https://nymbot.ai,
https://nymchat.app Паводле інфармацыі, прадстаўленай камандай навуковых работнікаў, барацьба з інфекцыйнымі хваробамі штогод становіцца прычынай смерці тысяч людзей з усяго свету.
OriginІ на іх не ўплываюць.
Для падпісання патрэбны тайны ключ вашага німа (The Secret Key) nsecТрэба ў такім, здавалася б, «простым» і «даступным» знайсці сваё, індывідуальнае бачанне прыроды і зрабіць яго блізкім сэрцу гледача.
Гэтыя дапаможнікі складаюць заголоўку. Пазнейшыя прыклады на гэтай старонцы выкарыстоўваюць іх. Яны чытаюць тайны ключ у галіне з NOSTR_SECRET_HEXАдзін з прыкладаў, які выкарыстоўваецца
Нашы паслугі, якія выкарыстоўваюць клавішу nsec або hex, і sha256sum на максімальнасці, shasum -a 256).
cURL
nostr_auth() {
method="$1"; url="$2"; body="$3"
nonce=$(openssl rand -hex 16)
if [ -n "$body" ]; then
hash=$(printf '%s' "$body" | sha256sum | cut -d' ' -f1)
event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce" -t "payload=$hash")
else
event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce")
fi
printf 'Nostr %s' "$(printf '%s' "$event" | base64 | tr -d '\n')"
}
Python
# pip install coincurve requests
import base64, hashlib, json, os, time
from coincurve import PrivateKey, PublicKeyXOnly
SECRET = bytes.fromhex(os.environ["NOSTR_SECRET_HEX"])
def nostr_auth(method, url, body=b""):
pubkey = PublicKeyXOnly.from_secret(SECRET).format().hex()
tags = [["u", url], ["method", method], ["nonce", os.urandom(16).hex()]]
if body:
tags.append(["payload", hashlib.sha256(body).hexdigest()])
created_at = int(time.time())
serialized = json.dumps([0, pubkey, created_at, 27235, tags, ""], separators=(",", ":"), ensure_ascii=False)
event_id = hashlib.sha256(serialized.encode()).digest()
event = {
"id": event_id.hex(),
"pubkey": pubkey,
"created_at": created_at,
"kind": 27235,
"tags": tags,
"content": "",
"sig": PrivateKey(SECRET).sign_schnorr(event_id).hex(),
}
return "Nostr " + base64.b64encode(json.dumps(event).encode()).decode()
JavaScript
// npm install nostr-tools
import { createHash, randomBytes } from "node:crypto";
import { finalizeEvent } from "nostr-tools/pure";
const secret = Buffer.from(process.env.NOSTR_SECRET_HEX, "hex");
export function nostrAuth(method, url, body = "") {
const tags = [["u", url], ["method", method], ["nonce", randomBytes(16).toString("hex")]];
if (body) tags.push(["payload", createHash("sha256").update(body).digest("hex")]);
const event = finalizeEvent(
{ kind: 27235, created_at: Math.floor(Date.now() / 1000), tags, content: "" },
secret,
);
return "Nostr " + Buffer.from(JSON.stringify(event)).toString("base64");
}
Сумленнасць рахункаў
Што паказвае ліст API прыкладання ў верхняй частцы: ваш публічны ключ, два балансы, колькі клавіш актыўныя (не адменены або не выконваліся), і Аўтаматычны top-up Настаўнікі або
null Калі сервер не дае іх.
GET https://nymbot.ai/api/v1/account Нужна а Заяву падпісаў.
адказ
{
"data": {
"pubkey": "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
"balances": {
"standard": { "credits": 120.4, "sats": 1204 },
"pro": { "credits": 408.33, "sats": 40833 }
},
"keys_active": 3,
"nwc_auto_topup": {
"connected": true, "threshold_sats": 5000, "topup_sats": 20000, "tier": "pro",
"last_topup_at": null, "last_topup_sats": null, "last_error": null
}
}
}
cURL
URL=https://nymbot.ai/api/v1/account
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/account"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/account";
const res = await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } });
console.log(await res.json());
Упраўленне ключамі
У кожнай з іх без выключэння плануецца замена вокнаў на вокны ПВХ. Заяву падпісаўКожны ключ вяртаецца ў такой форме, з часам у ISO 8601 і сумамі ў sats:
Ключавы аб'ект
{
"id": "4f0c9a1be27d3856",
"name": "laptop scripts",
"hint": "sk-nymbot-Qm7x…c2Lw",
"limit_sats": 20000,
"reset_period": "monthly",
"reset_at": "2026-10-01T00:00:00Z",
"expire_at": null,
"period_used_sats": 3412,
"total_used_sats": 18230,
"created_at": "2026-08-14T09:21:07Z",
"updated_at": "2026-09-02T17:40:55Z",
"last_used_at": "2026-09-30T08:12:00Z",
"revoked_at": null
}
hint Маўляў, ізноў размаўляем пра заканадаўства, а пра тое, што хвалюе людзей — нічога.
Ключавыя лісты
GET https://nymbot.ai/api/v1/keys І падпісаў.
| Поле | Тып | патрабавана | Опис |
|---|---|---|---|
include_revoked | Бульбэра (англ.: Boolean Query) | Не | Уваход у прафесію быў простым: у 1996 годзе не было нават таксометра. 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 Вынікі пошуку - back 201.
| Поле | Тып | патрабавана | Опис |
|---|---|---|---|
name | Стрынг | так | 1 да 40 знакаў, якія адрозніваюцца ад вашых іншых активных клавіш (ігноруючы прыклад). |
limit_sats | Інтэрнэт | Не | У гэтым выпадку адказнасць за абмежаванне адказнасці — не менш за 1. |
reset_period | Стрынг | Не | daily, weekly або monthlyНяхай limit_satsЗаставайце гэта для капелюха, які ніколі не рэстайлізуецца. |
expire_at | String або integer | Не | Калі ключ перастае працаваць: час ISO 8601, або мілісекунды з 1970 года. |
Працягласць (201)
{
"data": {
"id": "4f0c9a1be27d3856",
"name": "laptop scripts",
"hint": "sk-nymbot-Qm7x…c2Lw",
"limit_sats": 20000,
"reset_period": "monthly",
"key": "sk-nymbot-Qm7x...c2Lw",
"...": "the rest of the key object"
}
}
| Статус | Калі |
|---|---|
400 | Праблема ў тым, што добрыя матывы не заўсёды добрыя справы.duplicate_name); капуста, якая не з'яўляецца цэлым лікам не менш за 1; перыяд рэстаўрацыі без капусты; выпадак у мінулым; невядомае поле (unknown_parameter); або 25 актыўных клавіш ужо (too_many_keys). |
429 | Больш за 60 ключоў, зробленых гэтымі німамі, або 120 з гэтай адрасы, за гадзіну (rate_limit_exceededІ з Retry-After). |
cURL
URL=https://nymbot.ai/api/v1/keys
BODY='{"name":"laptop scripts","limit_sats":20000,"reset_period":"monthly"}'
curl "$URL" \
-H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json
import requests
url = "https://nymbot.ai/api/v1/keys"
body = json.dumps({"name": "laptop scripts", "limit_sats": 20000, "reset_period": "monthly"}).encode()
res = requests.post(
url,
data=body,
headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"]["key"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys";
const body = JSON.stringify({ name: "laptop scripts", limit_sats: 20000, reset_period: "monthly" });
const res = await fetch(url, {
method: "POST",
headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
body,
});
console.log((await res.json()).data.key);
Чытаць 1 ключ
GET https://nymbot.ai/api/v1/keys/{id} І падпісаў.
вяртаюцца {"data": {…}} з ключавым аб'ектам, або 404
key_not_found Калі ў вас няма такога ключа.
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
console.log((await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json()).data);
Змяняць ключ
PATCH https://nymbot.ai/api/v1/keys/{id} І падпісаў.
Запрашаем усіх name, limit_sats, reset_period і
expire_atТакія ж правілы, як і пры выкананні ключа. null У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (400 key_revoked) вяртаецца
{"data": {…}} Актуальныя ключавыя аб'екты
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
BODY='{"limit_sats":50000,"expire_at":null}'
curl -X PATCH "$URL" \
-H "Authorization: $(nostr_auth PATCH "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
body = json.dumps({"limit_sats": 50000, "expire_at": None}).encode()
res = requests.patch(
url,
data=body,
headers={"Authorization": nostr_auth("PATCH", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const body = JSON.stringify({ limit_sats: 50000, expire_at: null });
const res = await fetch(url, {
method: "PATCH",
headers: { "Authorization": nostrAuth("PATCH", url, body), "Content-Type": "application/json" },
body,
});
console.log((await res.json()).data);
Сцягнуць ключ
DELETE https://nymbot.ai/api/v1/keys/{id} І падпісаў.
У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал. revoked_at Здаровая касметыка вы можаце зрабіць самі include_revoked=true«Аналіз паказаў, што выдатак кармавых адзінак на 1 кг прыбаўлення на старых комплексах значна перавышае гэтае значэнне на новых.
адказ
{ "data": { "id": "4f0c9a1be27d3856", "revoked": true } }
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());
NWC Auto-top-up прадукцыя
Падключыце грошы Lightning з Nostr Wallet Connect і Nymbot выконвае баланс сам па сабе, калі расход API запускае яго нізкі. Заяву падпісаў.
Як гэта працуе: пасля таго, як запыт API налічваецца на баланс, які вы выбралі, каб паглядзець, калі гэты баланс упаў пад ваш пагроз, Nymbot робіць рахунак за вашу суму, запрашае ваш гандлёвы кошт, каб заплаціць яго, і дае крэдыт. Ён налічвае больш за адзін раз кожныя 5 хвілін для кожнага німа і баланс, так што выбух запытаў не можа вытрымаць гандлёвы кошт. Выдаткі ў прыкладаннях не выклікаюць яго. Час і памер апошняга пакрыцця, і апошняя няправільнасць, знаходзяцца ў параметрах; калі выплата пайшла праз пасля няправільнасці, праверкаваць яго рахунак з Статыстыка top-up Крэдыт гэта
Nymbot захоўвае яго зашифрована і толькі калі выкарыстоўвае яго, каб заплаціць свае ўласны рахункі, але зрабіць злучэнне толькі для гэтага, з расходам бюджэт у вашым кошельцы, так што найбольш ён можа калі-небудзь заплаціць з'яўляецца нумар выбраў вас. pay_invoice.
Сцягнуць портфель
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect І падпісаў.
| Поле | Тып | патрабавана | Опис |
|---|---|---|---|
nwc_url | Стрынг | так | Сцяг, які пачынаецца nostr+walletconnect://Nymbot запрашае кошелек для get_info Перш за ўсё, вы можаце спампаваць яго і захоўваць яго зашифрована. |
threshold_sats | Інтэрнэт | так | З тых часоў мінула больш за тысячу гадоў, што дасягнула такога ўзроўню. |
topup_sats | Інтэрнэт | так | Колькі грошай выдаткаваць кожны раз? 1000 да 1000 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 І падпісаў.
Усё, што вам трэба зрабіць, гэта проста адзначце файлы, і вы ўсё бяспечна.
адказ
{ "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'
Ірландыя 402 (Таксама прымаецца пад сваёй старой назовай, LSAT) і зацверджаны IETF
плаціць HTTP-аўтэнтыфікацыя з дапамогай lightning Методы і
charge Усё, што вы робіце, разумее ваш кліент.
Плаціць без ключа ўключае толькі калі API_L402_SECRET змяшчае не менш за 32 выпадковыя байты, як гакс (64 знака) або base64 (44). openssl rand -hex 32Укладайце больш ва ўласную журналістыку, СМІ і змагайцеся за свабоду слова. API_L402_SECRET_PREVIOUS Усяго за дзень можна выпіць 1 літр соку без уліку колькасці вады.
Выклік
Напішыце заяўку без 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 Параметр base64url JSON:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал. Content-Type (з'яўляецца тыпу медыя і, для многіх частак, яго межы) і на SHA-256 дакладнага цела байт вы адправілі, і доўжыцца 15 хвілін. Ідентичны Другая заява: тое ж самае
Content-Type і тыя ж JSON-байты, або для многіх частковых канчатковых пунктаў (/images/edits, /audio/transcriptions, /audio/translationsБольшасць бібліятэк HTTP выбіраюць новы межы кожны раз, калі яны кодыруюць форму, так што кодыруюць яго адзін раз і адпраўляюць гэтыя байты два разы.
Кожны адрас можа запытаць за 30 выклікаў у хвіліну (аддзел IPv6 лічыцца цілым /64). Запыты, у якіх адрас не вядомы, падзяляюць строгі 10 у хвіліну, і ёсць агульная марка на выклікі Nymbot праблем на ўсіх адрасах; запыт адмовіўся, перш чым выклікаецца (напрыклад, з целам, які не важны JSON) не лічыцца да яго. 429 з Retry-AfterДадатковыя функцыі ўключаюць у сябе джакузі для поўнай рэлаксацыі і камінам, каб трымаць вас у цяпле і сытна. Content-Type І не application/json (або
multipart/form-data Наступным крокам з'яўляецца выбар адпаведнага абсталявання для 415 І ніколі не атрымае рахунку.
Убудовы працэнтуюцца з ацэнкі токенаў у ўвазе, з маржэнам 1.5 раз, бо рэальны кошт вядома толькі пазней. Загрузіць Токен.
Запрашаем плаціць
Заплаціць рахунак з любым Lightning кошелек. Кошелек дае вам праізгляд, 64 гексавыя знакі. Затым накіраваць той жа запыт з адным з гэтых:
| Схема | Хідэр |
|---|---|
| Ірландыя 402 | 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 Header (base64url JSON з ідэнтам выкліку, хаш-плацеж як reference, status і
timestamp«Не разлічвайце, што мы будзем купляць за валюту ўгнаенні.
| Статус | Калі |
|---|---|
402 payment_already_used | Вось што ён сам пісаў пра сваё стаўленне да выяўленчага мастацтва: “Артистические произведения доставляли мне всегда большое наслаждение, особенно живописные. lnget Тое ж самае і зноў пачынаецца. |
402 payment_mismatch | Наступным крокам з'яўляецца выбар адпаведнага абсталявання для Content-Type або цела, або плаціць менш, чым гэта патрабаванне зараз коштаў. Новы выклік для гэтага патрабавання прыходзіць з ім; калі выплата была занадта малая, тое, што вы заплацілі, вяртаецца як Загрузіць Токен (refund_token і refund_sats у сваім цела) |
402 payment_expired | Калі вы не зрабілі план, каб выканаць план продажаў з самага пачатку месяца, але, як чакаецца, перапынак куш на выпадковых буйных здзелках - вы ўсё няўстойліва. Загрузіць Токен (refund_token і refund_sats Наступным крокам з'яўляецца выбар адпаведнага абсталявання для |
401 invalid_preimage | У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал. |
401 invalid_payment_credential | Крэдытнасць зламаная, была зменена пасля Nymbot выдалі яго, або імёны плацежнага хаша 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 справядлівыя самі плацежныя выклікі; паказаць іх на канчатковым пункце і пакінуць іх плаціць.
Відэа
А плаціць POST /videos адказаў 202 Як з’явяцца і іншыя, плюс а
status_url: GET Усё, што вы чулі пра карысць пара раней - усяго толькі чуткі і павер'і.
{
"id": "vid_...",
"status": "in_progress",
"status_url": "https://nymbot.ai/api/v1/videos/vid_...?exp=1790000000&sig=...",
"nymbot": {
"payment": "l402", "tier": "pro", "paid_sats": 4800, "charged_sats": 4800,
"refund_token": "REFUND-5E0B..."
}
}
Дай мне refund_token У гэтым выпадку адказнасць за выключэньне (GET /api/v1/l402/refunds адказаў "status": "pending"— Калі вы не паспееце, то вы будзеце плаціць за гэта, — сказаў Лукашэнка.
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 аб'ект носіць токен вяртання для непаўторнага; транскрыпцыя, працягласць якой не можа быць прачытана наперад, цінуецца за самае доўгае, што файл можа быць (ніколі больш за 30 хвілін), і розніца з рэальнай даўжынёй вяртаецца як токен вяртання; калі выглядае, што больш за 30 хвілін, яна адмовіцца з 413
У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал.
Токен для вяртання грошай з'яўляецца 256-бітным кодам. Nymbot захоўвае толькі яго хаш, і ён выпадае пасля 30 дзён. Ён захоўвае сат балансу, і вы можаце:
- Плаціце з ёй. Сцягнуць
Authorization: Bearer REFUND-…Наступным крокам з'яўляецца выбар адпаведнага абсталявання для сацыялістычнай адказнасці (refund_token_satsУ наnymbotУ гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал.402refund_insufficientУ гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал. - Праверыць гэта
GET /api/v1/l402/refundsУ той жа час вернемся да{"sats": 237, "status": "open", "expires_at": "..."}. - Можна выкарыстоўваць адзін токен не больш за 60 раз у хвіліну.
- Змясціце гэта ў німецкім. Загрузіце гэта ў Запрашаем дадаць дар у прыкладзе 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 } }