Žinių bazė kūrėjai
Balansas, viršūnės ir raktai
Patikrinkite, ką turite, viršų per žaibas, viršų automatiškai iš savo piniginės, pamatyti, kiek kainuoja kiekvienas prašymas, ir valdyti raktus iš kodo.
Patogumui šis puslapis išverstas mašininiu būdu. Tinkama versija anglų kalba.
Patikrinkite balansą
Tiek jūsų balansai, tiek kiek naudojama šio rakto viršutinė dalis.
GET https://nymbot.ai/api/v1/credits/balance Reikalingas API raktas. POST Tai taip pat veikia klientams, kurie to tikisi.
balance yra du balansai kartu doleriais dabartine Bitcoin kaina, įrankiams, kurie tikisi vieno skaičiaus (null likusi dalis yra kredituose ir įkainiuose, tai yra, kaip balansai iš tikrųjų laikomi. key rakto, kuris pasiekė savo viršutinę ribą, vis dar gali patikrinti balansą.
Atsakymas
{
"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"
}
}
| statusą | Kada |
|---|---|
401 | Raktas yra trūkstamas, nežinomas, atšauktas arba pasibaigęs. |
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);
Mokėjimo būdai
Kaip jūs galite viršų, ir ribas. žaibas yra vienintelis metodas.
GET https://nymbot.ai/api/v1/topup/payment-methods Nereikia jokių raktų.
Top-up yra nuo 10 iki 1 000 000 sats; Pro top-up turi nusipirkti bent vieną Pro kreditą, todėl jis prasideda nuo 100 sats. bulk_bonus išvardija papildomą kreditą didesniuose viršūnėse, taip pat kaip ir programoje: 10%, 15% ar 20% daugiau standartiniuose viršūnėse nuo 500, 1000 ar 5000 sats, o "Pro" viršūnėse nuo 5000, 10.000 ar 50 000 sats.
Atsakymas
{
"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);
Į viršų virš žaibo
Sukuria žaibo sąskaitą faktūrą, kuri prideda kredito į nym raktas priklauso. mokėti jį iš bet Lightning piniginėje, tada Patikrinkite jį Norėdami gauti papildomą kreditą.
POST https://nymbot.ai/api/v1/topup/create/btc-lightning Reikalingas API raktas.
| Lauko | Tipas | Reikalingas | Aprašymas |
|---|---|---|---|
amount | Numeris | Taip | Kiek tai yra, į currencyVisas skaičius už statymą. |
currency | Stringų | ne | SATS (Tai yra nesėkmė) USD arba BTCDoleriai konvertuojami pagal dabartinę Bitcoin kainą. |
tier | Stringų | ne | pro (Darbo sutartis) arba standardĮ kurią pusiausvyrą kreipiasi kreditas. |
Standartinis kreditas yra 10 sats ir Pro kreditas 100 sats, plius bet kokia masinė premija;
credits Paaiškinkite, ką ši sąskaita pridės.
Atsakymas
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"payment_request": "lnbc100u1p5...",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": "2026-09-30T09:27:00Z",
"status": "pending"
}
| statusą | Kada |
|---|---|
400 | Kitas metodas kelyje (unsupported_method), nežinoma valiuta (unsupported_currency) arba lygis, trūkstama suma, arba suma, mažesnė už mažiausią (amount_too_smallvirš 1 000 000 litų (amount_too_large) arba atsisakyta Lightning piniginę (amount_out_of_range). |
429 | Daugiau nei 60 sąskaitų už šį nym, arba 120 iš šio adreso, per valandą (rate_limit_exceededsu Retry-After). |
502 | Šiuo metu negalima pateikti sąskaitos faktūros (invoice_unavailablesu 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);
Apžiūrėkite – Top-up
Paklausia, ar sąskaita faktūra buvo sumokėta, ir, kai ji yra, prideda kreditą. patikrinimas yra tai, kas ją kredituoja, todėl po apmokėjimo patikrinkite, kol statusas yra creditedVėliau patikrinimas yra saugus: kreditas nusileidžia vieną kartą, nesvarbu, kiek kartų paprašysite.
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - reikia raktą iš nim, kuris padarė sąskaitą faktūrą.
status yra pending (dar nėra apmokėta) paid (apmokėta, bet dar neįskaityta; patikrinti dar kartą), credited (į savo balansą) arba expired (Negalima mokėti laiku). balanso laukai yra už lygį, kuriame viršuje yra sąskaitos faktūros.
Atsakymas
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| statusą | Kada |
|---|---|
400 | ID nėra 64 simbolių ID iš sukurtas skambutis. |
404 | Nėra sąskaitos faktūros pagal tą id jūsų 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);
Ieškoti istorijos
Viena eilutė už užklausą: kas tai buvo, koks modelis, kiek žetonų ir kokia kaina. Nėra perspėjimų ar atsakymų, todėl nė vienas negrąžinamas. eilutės laikomos 90 dienų, naujausias pirmas. raktas, kuris pasiekė savo ribą, vis dar gali perskaityti savo istoriją.
GET https://nymbot.ai/api/v1/queries/history — reikia API rakto, kuris mato savo užklausas, arba Pasirašė prašymą Iš tavo nym, kuris mato kiekvieną raktą.
| Lauko | Tipas | Reikalingas | Aprašymas |
|---|---|---|---|
page | Išsami informacija (query) | ne | Pagal numatytuosius nustatymus 1, ne daugiau kaip 1000; aukštesnis puslapis yra 400 invalid_value. |
page_count | Išsami informacija (query) | ne | Pagal numatytuosius parametrus yra 20, bet ne daugiau kaip 100. |
start_dateend_date | Žymės: String Query | ne | ISO 8601 datos ir laikas. |
model | Žymės: String Query | ne | Tik šį modelį. |
type | Žymės: String Query | ne | chat, responses, messages, image, video, speech, transcription arba embedding. |
all_keys | Kėdainiai (query) | ne | Su vienu rakteliu: true yra kiekvienas to paties nym.Default raktas false. |
key_id | Žymės: String Query | ne | Su pasirašytu prašymu arba su all_keys=trueTik šį raktą. |
Atsakymas
{
"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);
Pasirašyti sąskaitos prašymus
Rengiant, keičiant ir atšaukiant raktus, sąskaitos santrauką ir automatinius viršūnių neatsižvelgiama į API raktą.Jie paima parašą iš jūsų nym, todėl nutekėjęs raktas gali išleisti iki savo viršutinės ribos, bet niekada negali padaryti kito rakto ar padidinti savo viršutinės ribos.
Programa tai daro už jus: viskas joje Ugnis Šiame skyriuje reikia tik valdyti raktus iš savo kodo.
Parašas yra 27235 tipo Nostr įvykis (NIP-98), siunčiamas koduojant base64
Authorization Header su žodžiu Nostr Priekyje yra:
Įvykio
{
"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": "..."
}
uyra visas užklausos URL, įskaitant užklausos eilutę, kaip išsiųsta.methodTai yra HTTP metodas.payloadyra SHA-256 žaliavos užklausos kūno, hex.POSTirPATCH, ir kūnas, kurį siunčiate, turi būti byte už byte tas, kurį hashed.created_atturi būti per 60 sekundžių nuo serverio laikrodžio.- Kiekvienas įvykis veikia vieną kartą, a
GETįtraukta, todėl užfiksuoto antraštės negalima atkurti. Pasirašykite naują užklausą.noncežymėti atsitiktinę reikšmę, kad du užklausos, pasirašytos toje pačioje sekundėje, vis dar skiriasi. - Pasirašyto prašymo kūnas gali būti ne didesnis kaip 64 KB, o kūnui reikia
Content-Type: application/json.
Trūkstamas įvykis grįžta 401 missing_nostr_authvienas, kuris yra blogai suformuotas, blogai pasirašytas, per senas arba skirtingam URL, metodu ar kūnu grąžina
invalid_nostr_auth, su pranešimo priežastimi; pakartotinai panaudotas vienas grįžta
nostr_auth_replayedPasirašymas patikrinamas prieš skaitant kūną, ir kiekvienas adresas gali jo nesugebėti 30 kartų per minutę (IPv6 adresas skaičiuojamas kaip jo visas /64); po to jis gauna 429 su
Retry-After.
Naršyklės gali skambinti šiems galiniams taškams tik iš „Nymbot“ pačių svetainių (https://nymbot.ai,
https://nymchat.app Puslapis bet kurioje kitoje svetainėje negrąžina CORS antraštės, todėl negali perskaityti to, ką jie grąžina.
OriginJie nėra paveikti.
Pasirašyti reikia savo nym slaptą raktą (The nsec), kuri kontroliuoja viską: jūsų tapatybę, istoriją ir balansą. Tik įdėkite jį į scenarijų kompiuteryje, kuriuo pasitikite, perskaitykite jį iš aplinkos, o ne parašykite jį į failą, ir pirmenybę teikiate programai, kai galite.
Šie padėjėjai sukuria antraštę. Vėlesni šio puslapio pavyzdžiai juos naudoja. NOSTR_SECRET_HEXcURL vienas naudoja
Nak komandinės eilutės įrankis, kuris naudoja nsec arba hex raktą, ir sha256sum • su 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");
}
Sąskaitos santrauka
Kas rodo programos API lapą viršuje: jūsų viešasis raktas, abu balansai, kiek raktų yra aktyvūs (neatšaukti ar pasibaigę) ir Automatinis viršutinis nustatymus arba
null kai serveris jų nesuteikia.
GET https://nymbot.ai/api/v1/account Reikia a Pasirašė prašymą.
Atsakymas
{
"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());
Raktų valdymas
Galutiniai taškai, esantys už programos raktų sąrašo. Pasirašė prašymąKiekvienas raktas grąžinamas šioje formoje, su laikais ISO 8601 ir sumomis sats:
Pagrindinis objektas
{
"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 Pakanka atpažinti raktą, bet jo nenaudoti.Pats raktas grąžinamas tik vieną kartą, kai jis sukurtas.
Raktų sąrašas
GET https://nymbot.ai/api/v1/keys Aš pasirašiau.
| Lauko | Tipas | Reikalingas | Aprašymas |
|---|---|---|---|
include_revoked | Kėdainiai (query) | ne | Įtraukti atšauktus raktus. false. |
Atsakymas
{ "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);
Sukurkite raktą
POST https://nymbot.ai/api/v1/keys Pasirašyta, grįžta 201.
| Lauko | Tipas | Reikalingas | Aprašymas |
|---|---|---|---|
name | Stringų | Taip | nuo 1 iki 40 simbolių, kurie skiriasi nuo kitų aktyvių raktų (neatsižvelgiant į atvejį). |
limit_sats | Integracijos | ne | Išlaidos kapsulė į sats, bent 1. palikite jį be kapsulės. |
reset_period | Stringų | ne | daily, weekly arba monthlyReikia limit_satsPalikite jį už dangtelį, kuris niekada neišdildys. |
expire_at | String arba integer | ne | Kai raktas nustoja veikti: ISO 8601 laikas, arba milisekundės nuo 1970 m. |
Atsakymas į klausimą (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"
}
}
| statusą | Kada |
|---|---|
400 | trūkstamas arba per ilgas pavadinimas; jau naudojamas pavadinimas (duplicate_name); kapsulė, kuri nėra ne mažiau kaip 1 skaičius; atkūrimo laikotarpis be kapsulės; galiojimo laikas praeityje; nežinomas laukas (unknown_parameter); arba 25 aktyvūs raktai jau yra (too_many_keys). |
429 | Daugiau nei 60 raktų, pagamintų iš šio nym, arba 120 iš šio adreso, per valandą (rate_limit_exceededsu 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);
Skaityti vieną raktą
GET https://nymbot.ai/api/v1/keys/{id} Aš pasirašiau.
Sugrįžta {"data": {…}} su pagrindiniu objektu, arba 404
key_not_found jei jūsų raktas neturi šio 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);
Keisti raktą
PATCH https://nymbot.ai/api/v1/keys/{id} Aš pasirašiau.
Siųskite bet kurį name, limit_sats, reset_period ir
expire_atTaisyklės yra tokios pačios, kaip ir rengiant raktą. null išvalyti lauką: nėra užrakto, nėra atkūrimo, nėra galiojimo pabaigos. keičiant atkūrimo laikotarpį prasideda naujas laikotarpis nuo nulio.400 key_revoked• grįžta
{"data": {…}} su atnaujintu raktiniu objektu.
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);
Atšaukti raktą
DELETE https://nymbot.ai/api/v1/keys/{id} Aš pasirašiau.
Sustabdo raktą iš karto, gerai. Jis lieka sąraše su revoked_at išdėstytas ir gali būti matomas su include_revoked=trueAtšaukti raktą, kuris jau atšauktas, atsako taip pat. Tik naujausi 50 atšauktų raktų išsaugomi; senesni ištrinami, kai atšaukiamas kitas raktas.
Atsakymas
{ "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“ žaidimas
Prijunkite „Lightning“ piniginę su „Nostr Wallet Connect“ ir „Nymbot“ padidina savo balansą, kai API išlaidos yra mažos. programos API lapas turi tuos pačius nustatymus; tai yra galiniai taškai. Pasirašė prašymą.
Kaip tai veikia: po to, kai API prašymas yra apmokestinamas į balansą, kurį pasirinkote žiūrėti, jei tas balansas nukrito žemiau jūsų slenksčio, "Nymbot" pateikia sąskaitą faktūrą už jūsų viršutinę sumą, prašo jūsų piniginės sumokėti, ir prideda kreditą. Tai padidėja ne daugiau kaip kartą per 5 minutes už kiekvieną nym ir balansą, todėl prašymų sprogimas negali ištuštinti piniginės. Išlaidos programose jo nesukelia. Paskutinės viršutinės sumos laikas ir dydis ir paskutinė klaida yra nustatymuose; jei mokėjimas praėjo po klaidos, patikrinkite savo sąskaitą faktūrą su Aukščiausio lygio statusas Jį kredituoja
"Nymbot" saugo jį užšifruotą ir naudoja jį tik apmokėti savo viršutines sąskaitas faktūras, bet sukurkite ryšį tik dėl to, su išlaidų biudžetu jūsų piniginėje, todėl labiausiai jis kada nors galėtų sumokėti yra pasirinktas numeris. pay_invoice.
Prijungimas prie piniginės
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Aš pasirašiau.
| Lauko | Tipas | Reikalingas | Aprašymas |
|---|---|---|---|
nwc_url | Stringų | Taip | Ryšio juosta, pradedant nostr+walletconnect://Nymbot prašo piniginės get_info prieš išsaugant jį, ir saugo jį užšifruotas. |
threshold_sats | Integracijos | Taip | Į viršų, kai balansas nukrenta žemiau šių daugelio sats. |
topup_sats | Integracijos | Taip | Kiek kiekvieną kartą pridėti. nuo 1 000 iki 1 000 000 sats. |
tier | Stringų | ne | pro (Darbo sutartis) arba standard: balansas stebėti ir viršuje. |
Atsakymas
{
"data": {
"connected": true,
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
"last_topup_at": null,
"last_topup_sats": null,
"last_error": null
}
}
| statusą | Kada |
|---|---|
400 | Nėra jokios ryšio eilutės (invalid_nwc_url• piniginė neatsakė į savo perdavimą (nwc_unreachable) arba atsisakė patikrinti (nwc_rejected(Sąskaitos negalima atsiskaityti už sąskaitas)nwc_missing_permission3) arba sumą, kuri yra už ribų. |
501 | Automatiniai viršutiniai langai nėra įjungti šiam serveriui (nwc_unavailableTas pats pasakytina ir apie kitus du galutinius taškus. |
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());
Skaityti nustatymus
GET https://nymbot.ai/api/v1/nwc-auto-topup Aš pasirašiau.
Grąžina tą patį objektą, su kuriuo connected: false ir kitos sritys
null kai nėra jokios piniginės. pati ryšio eilutė niekada negrįžta.
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());
Atjungimas
DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Aš pasirašiau.
Ištrina išsaugotą ryšio eilutę. Nėra daugiau viršutinių kopijų. Norėdami būti tikri, taip pat galite atšaukti ryšį savo piniginėje.
Atsakymas
{ "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());
Mokėjimas pagal užklausą be rakto
Fiksuotos kainos galutiniai taškai gali būti mokami už vieną užklausą vienu metu per "Lightning", be raktų, be sąskaitos ir be balanso: POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations ir POST /embeddingsPokalbių, atsakymų ir pranešimų visada reikia raktą. užklausą, kurioje yra raktas yra įskaičiuojamas į likutį kaip įprasta; mokėjimo srautas prasideda tik tada, kai nėra siunčiamas raktas.
"Nymbot" kalba apie dvi tos pačios idėjos versijas, iš vieno "Backend": "Lightning Labs"
L402 (taip pat priimtas pagal savo senąjį vardą, LSATIETF projektas
Mokėjimas HTTP autentifikavimo schema su lightning Metodas ir
charge Naudokite tai, ką supranta jūsų klientas.
Mokėjimas be rakto įjungtas tik tada, kai API_L402_SECRET turi ne mažiau kaip 32 atsitiktinius baitus, pavyzdžiui, šešioliktuką (64 simbolius) arba bazę64 (44). openssl rand -hex 32Trumpesnė arba spėjama reikšmė išjungia funkciją ir registruoja, kodėl. API_L402_SECRET_PREVIOUS vieną dieną: įgaliojimai, būsenos URL ir iššūkiai, padaryti pagal jį, toliau dirba, kol jie baigiasi.
Iššūkis
Siųskite prašymą ne Authorization jei jis yra galiojantis, nieko neveikia, ir jūs gaunate 402 Payment Required su sąskaita faktūra už tiksliai tai, ką prašymas kainuoja: ta pati kaina, kurią raktas sumokėtų, konvertuota į 10 sats standartinį kreditą arba 100 sats Pro kreditą ir suapvalinta iki viso sat (bent 1 sat, ir bent 0.05 kredito minimumą). WWW-Authenticate Iššūkiai dėl tos pačios sąskaitos:
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 }
}
Mokėjimo request Parametras yra base64url JSON:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
Iššūkis yra susijęs su galutiniu tašku, su Content-Type (jos žiniasklaidos tipas ir, daugiafunkcinis, jos riba) ir į SHA-256 tiksliai kūno baitų siunčiate, ir trunka 15 minučių. Tapatybės Prašymas dar kartą: tas pats
Content-Type ir tuos pačius JSON bytes, arba daugelio dalių galiniams taškams (/images/edits, /audio/transcriptions, /audio/translationsDauguma HTTP bibliotekų pasirenka naują ribą kiekvieną kartą, kai jie koduoja formą, todėl vieną kartą ją koduoja ir siunčia tuos bajtus du kartus.
Kiekvienas adresas gali paprašyti 30 iššūkių per minutę (IPv6 adresas skaičiuojamas kaip jo visas /64). Prašymai, kurių adresas nežinomas, dalijasi griežtesniu 10 per minutę, ir yra bendra riba iššūkių Nymbot problemoms visose adresose; prašymas, atmestas prieš iššūkį (pavyzdžiui, su kūnu, kuris nėra galiojantis JSON) nesiekia. 429 su Retry-AfterApmokami galutiniai taškai, skambinami be rakto ar įgaliojimų, taip pat skaičiuojami iki bendros 120 neautentifikuotų užklausų per minutę vienam adresui ribos. Content-Type nėra application/json (arba
multipart/form-data už įkrovimą) atsisakoma 415 Ir niekada negauna sąskaitos.
Įterpimai kainuoja iš įvesties žetonų apskaičiavimo, su 1,5× marža, nes tikrasis skaičius yra žinomas tik vėliau. Grąžinti tokeną.
Siųsti mokėjimą
Apmokėkite sąskaitą su bet kuriuo Lightning pinigine. Piniginė suteikia jums išankstinį vaizdą, 64 šešių simbolių. Tada išsiųskite tą patį prašymą su vienu iš šių:
| schemos | Headeriai |
|---|---|
| L402 | Authorization: L402 <macaroon>:<preimage> (LSAT Taip pat veikia) |
| Mokėjimas | Authorization: Payment <base64url JSON>Kur yra JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}} |
Mokama užklausa atsako lygiai taip pat, kaip ir užklausa, atlikta naudojant raktą, išskyrus tai, kad nymbot
Objektas neturi balanso laukų: {"payment": "l402", "tier": "pro", "paid_sats": 237,
"charged_sats": 237}Ir yra ne X-Nymbot-Balance-Sats Užklausą, sumokėtą naudojant Mokėjimo schemą, taip pat gauna Payment-Receipt antraštė (base64url JSON su iššūkio id, mokėjimo hash kaip reference, status ir
timestampMokamos užklausos nėra susietos su jokia nym, todėl jos nerodomos užklausų istorijoje.
| statusą | Kada |
|---|---|
402 payment_already_used | Atsakymas yra naujas iššūkis šiam prašymui, todėl klientas, kuris užfiksuoja savo paskutinį įgaliojimą (kaip lnget Ir vėl paprasčiausiai grįžta. |
402 payment_mismatch | kredencialas buvo išduotas kitam galutiniam taškui, Content-Type arba kūnas, arba mokėti mažiau nei šis prašymas dabar kainuoja. su juo ateina naujas iššūkis šiam prašymui; jei mokėjimas buvo per mažas, tai, ką sumokėjote, grįžta kaip Grąžinti tokeną (refund_token ir refund_sats į savo kūną). |
402 payment_expired | Daugiau nei 15 minučių praėjo nuo iššūkio. su juo ateina naujas iššūkis. Jei išankstinis vaizdas rodo, kad sumokėjote, tai, ką sumokėjote, grįžta kaip Grąžinti tokeną (refund_token ir refund_sats Vieną kartą; tada kredencialas yra panaudotas. |
401 invalid_preimage | Išankstinis vaizdas nesusijęs su sąskaitos faktūros mokėjimo hash. Mokėjimas nėra panaudotas. |
401 invalid_payment_credential | Įgaliojimai yra netinkamai suformuoti, buvo pakeisti po to, kai "Nymbot" jį išleido, arba pavadinimai mokėjimo hash "Nymbot" niekada neišdavė sąskaitos faktūros. makaronas su įspėjimu "Nymbot" nežino arba su prieštaraujančiais įspėjimais yra atmestas. |
429 rate_limit_exceeded | Daugiau nei 30 įgaliojimų ar raktų, kurie nepavyko patikrinti, atėjo iš šio adreso per minutę, arba vienas grąžinimo žetonas buvo išsiųstas daugiau nei 60 kartų per minutę. 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"));
Klientai sukūrė mppx su žaibo metodu patys tvarko mokėjimo iššūkį; nukreipkite juos į galinį tašką ir leiskite jiems mokėti.
Vaizdo
Apmokėta POST /videos Atsakymai 202 Pavyzdžiui, kaip vienas, plius a
status_url: GET Jis yra pasirašytas ir veikia 24 valandas, kol darbas yra išlaikytas.
{
"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..."
}
}
Laikykitės refund_token iš šio atsakymo: jis rodomas tik čia. Jis yra tuščias, o vaizdo įrašas rodo (GET /api/v1/l402/refunds Atsakymai "status": "pending"); jei rodymas nepavyksta neapmokėtas, mokėjimas nusileidžia ant jo.
refund_sats už grąžintą darbą, bet niekada žymenį, todėl būsenos URL pasidalijimas nesidalija grąžinimu.
grąžinimo
Jei mokamas prašymas nepavyksta ir teikėjas nubaudė „Nymbot“ už bandymą, mokėjimas išlieka ir klaida sako taip, su charged_sats, lygiai taip pat, kaip ir užrakintam prašymui. Jei jis nepavyksta be sąskaitos faktūros, klaida sukelia Grąžinti tokeną Verta to, ką sumokėjote:
{
"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"
}
}
Nepanaudotos dalys grįžta tuo pačiu būdu: jei paprašėte dviejų nuotraukų ir viena nepavyko atsiskaityti, sėkmingas atsakymas nymbot objektas turi grąžinimo žetoną už trūkstamą; transkripcija, kurios ilgio negalima perskaityti iš anksto, kainuoja už ilgiausią failą (niekad ilgiau nei 30 minučių), o skirtumas nuo tikro ilgio grįžta kaip grąžinimo žetonas; jei paaiškėja, kad jis yra ilgesnis nei 30 minučių, jis atmetamas su 413
Įterpimai grąžina tai, ką išlaikė įvertinimas. nesėkmingas vaizdo įrašas grąžina tokeną, kurį grąžino jo pateikimas.
Grąžinimo žymuo yra atsitiktinis 256-bitinis kodas. „Nymbot“ saugo tik savo hash, ir jis baigiasi po 30 dienų.
- Mokėkite su juo. Siųsti
Authorization: Bearer REFUND-…Pavyzdžiui, „OpenAI SDK“ jį naudoja kaip savo API raktą, o kaina priklauso nuo tokeno ir tai, kas lieka, lieka ant jo (refund_token_satsįnymbotobjektas). žetonas, kurio vertė yra mažesnė nei užklausos atsakymai402refund_insufficientNeapmokėtas nesėkmė grąžina sats į tą patį žetoną. - Patikrinkite jį
GET /api/v1/l402/refundsSu ta pačia antrašte grįžta{"sats": 237, "status": "open", "expires_at": "..."}. - Vienas žetonas gali būti naudojamas ne daugiau kaip 60 kartų per minutę.
- Perkelkite jį į nym. Įdėkite jį į Išsaugokite dovaną „Nymbot“ programėlėje arba skambinkite
POST /api/v1/l402/refunds/redeemSu a Pasirašė prašymą ir{"refund_token": "REFUND-...", "balance": "standard"}(arba"pro"Visi kreditai patenka į balansą (10 sats kiekvienam standartiniam, 100 Pro); statymai, kurie nepadaro viso kredito likimo ant žetonų API užklausoms.
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"
Atsakymas
{ "data": { "credited": 23, "tier": "standard", "balance_credits": 123, "remaining_sats": 7 } }