kahua ʻike Nā mea kūkulu polokalamu
Ka loaʻa kālā, nā hoʻopuna kālā, a me nā kī
E nānā i kāu mea i loaʻa nei, e hoʻopukapuka ma luna o Lightning, e hoʻopukapuka pololei mai kāu ʻoe ponoʻī wallet, e nānā i ka kumuwaiwai o kēlā me kēia ʻimi, a e hoʻomalu i nā kī mai ka kōkua polokalamu.
Ua unuhi ʻia kēia ʻaoʻao no ka maʻalahi. ʻO ka ʻōlelo Pelekane ka mana e pili ana.
Ke nānā nei i ka loaʻa
O nā kālā i loaʻa i ʻōlua a me ka nui o ka nui o kēia pūʻolo i hoʻohana ʻia.
GET https://nymbot.ai/api/v1/credits/balance — pono i ka API key. POST lawe pū nō, no nā mea kūʻai e ʻaeʻae nei.
balance He nui paha ka ʻelua pila pili pū ma ke kālā i ke kumu kūʻai Bitcoin i kēia manawa, no nā mea hana e ʻāpana ai i kekahi helu wale nō (null inā ʻole hiki ke heluhelu ʻia ka ʻuauhau). ʻO ka nui loa ʻia, he
kredite a me nā sats, ʻo ia ke ala e mālama ʻia ai nā loaʻa loa. key wehewehe i ka leota
i nānā ai. He leota i hiki i kona pahuhopu hiki loa ka mea e nānā ai i ka loaʻa.
A'ohe mea pane
{
"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"
}
}
| Kālele | ʻAeʻe? |
|---|---|
401 | Ua nele ka pūhea, ʻaʻole i maopopo, ua wehe ʻia, a i ʻole ua loaʻa ka loaʻa o ka wā. |
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);
Nā ala kālā ʻana
Pehea e hoʻopunamanaʻi ai, a me nā palena. ʻO Lightning ka ʻano wale nō.
GET https://nymbot.ai/api/v1/topup/payment-methods — ʻaʻole pono he pohiʻena.
ʻO ka hoʻopukapuka ʻana he 10 a hiki i ka 1,000,000 nā sats; ʻo ka hoʻopukapuka Pro, pono e kūʻai i koke kapa ʻoi loa he kumu Pro kahi, no laila e hoʻomaka ana ma nā 100 nā sats. ʻO nā loea i ka hola e mālama ana i ka ʻauinalā o ka Bitcoin. bulk_bonus haʻiupau i ka loaʻa ʻē aʻe
o ka pūnaewele ma nā mea hoʻopukapuka nui aʻe, e like me ka hola i loko o ka polokalamu: 10%, 15% a i ʻole 20% hou ma nā hoʻopukapuka maʻamau mai
500, 1,000 a i ʻole 5,000 sats, a ma nā hoʻopukapuka Pro mai 5,000, 10,000 a i ʻole 50,000 sats.
A'ohe mea pane
{
"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);
Hoʻopukapuka ʻana ma luna o Lightning
He invoice Lightning kēlā e hoʻemi ana i ka pūnaewele i ka nym e noho nei ke kī, e kākau i ka uku mai ana mai kēlā me kēia pūnaewele Lightning, a e ʻo ia Nānā i kēia kiaʻi ʻia ka kākoʻo kālā.
POST https://nymbot.ai/api/v1/topup/create/btc-lightning — pono i ka API key.
| Māhele | ʻOlelo | Pono | Kāʻano |
|---|---|---|---|
amount | helu | ʻAe | Pehea ka nui, ma currencyHe helu pololei no nā sats. |
currency | lele | ʻAʻole | SATS (ka mea kumu), USD aʻole BTCKe hoʻololi ʻia nā dola ma ke kumuhana Bitcoin o kēia manawa. |
tier | lele | ʻAʻole | pro (ka mea kapa ʻia ʻia) a standard: he aha ka loaʻa e hele ai ka credit. |
He kumu kōkua maʻamau ʻo 10 sats a he kumu kōkua Pro ʻo 100 sats, me ke kūʻai nui ʻana;
credits heaheo ka mea e hoʻemi ana kēia invoice.
A'ohe mea pane
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"payment_request": "lnbc100u1p5...",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": "2026-09-30T09:27:00Z",
"status": "pending"
}
| Kālele | ʻAeʻe? |
|---|---|
400 | He ala hou ma ke ala (unsupported_method), he kālā ʻole i maopopo ʻia (unsupported_currency) a lālā, he nui i nele, a he nui i lalo o ka nui loa ʻole (amount_too_small), he nui aʻe i loko o nā 1,000,000 sats (amount_too_large) a i ʻole i loaʻa mai e ka Lightning wallet (amount_out_of_range). |
429 | He nui aʻe i ka ʻumu 60 mau pepa uku no kēia inoa, a i ʻole he 120 mai kēia panahelena, i loko o ka hola ʻekahi (rate_limit_exceeded, me Retry-After). |
502 | ʻAʻole hiki ke hana i kekahi ʻinvoika i kēia manawa (invoice_unavailable, me 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);
Ke nānā nei i kahi hoʻopuka kālā
Nānā inā ua uku ʻia ka ʻākoakoa a, ke uku ʻia paha, hoʻemi i ka kākoʻo. ʻO ka nānā ʻana ka mea e kākoʻo ai, no laila ma hope o ka uku ʻana, nānā no ka manawa a hiki i ka ʻāpana... creditedE nānā hou i hope
he pololei ka hana: e loaʻa ana ka kālā i ka manawa ʻekahi, regardless no ka nui o kā ʻoe nānā ʻana.
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — pono e loaʻa kahi pākaukau mai ka inoa i hana i ka ʻākoakoa.
status he pending (ʻaʻole i uku ʻia), paid (i uku ʻia, akā ʻaʻole i loaʻa; e nānā hou), credited (ma kou pūlā) a i ʻole expired (ʻaʻole i kākoʻo ʻia
i ka manawa). He mau luna pono kēlā mau papa loaʻa no ka lūʻau e hoʻoponopono ai i ka papa loaʻa.
A'ohe mea pane
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| Kālele | ʻAeʻe? |
|---|---|
400 | ʻAʻole ka id o ka ʻole ka id 64-helu mai ka ulu ʻana o ka ʻoluʻolu. |
404 | ʻAʻole he bilu ma o kēlā inoa ʻukauka no kou inoa nanea (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);
Ka moʻolelo nānā ʻana
Lāuna kikoʻī no kēlā me kēia ʻimi: ka mea i hana ʻia, ka mea hana ʻia, ka nui o nā token a me kona kumuhana. ʻAʻole mālama ʻia nā nānā ʻia a i ʻole nā pane, no laila ʻaʻole e hoʻihoʻi ʻia kēlā me kēia. E mālama ʻia nā lāuna no nā lā 90, ka mea hou loa ma mua. ʻO ka pūnaewele i hiki i kona piko ka hiki ʻana i ka heluhelu ʻana i kona moʻolelo.
GET https://nymbot.ai/api/v1/queries/history — e pono ai kekei API, e ʻike ana i kona mau noi, a i ʻole he olelo i ʻōlelo i hōʻike ʻia mai kou inoa huna, i ka ʻike ʻia ai nā puka a pau.
| Māhele | ʻOlelo | Pono | Kāʻano |
|---|---|---|---|
page | helu (nānā) | ʻAʻole | Kumu 1, ka nui loa ʻo 1,000; he ʻaoʻao ʻoi loa ʻo ia i ʻole 400 invalid_value. |
page_count | helu (nānā) | ʻAʻole | Nā papa i kēlā me kēia ʻaohelo. Ka ʻole ʻo 20 ka mea i hoʻomaka ʻia, a i mea nui ʻo 100. |
start_dateend_date | lālā (nānā) | ʻAʻole | Nā lā a i ʻole nā manawa ISO 8601. |
model | lālā (nānā) | ʻAʻole | Hele wale kēia moʻolelo. |
type | lālā (nānā) | ʻAʻole | chat, responses, messages, image, video, speech, transcription aʻole embedding. |
all_keys | boolean (nā nānā ʻana) | ʻAʻole | Me nā pohaku: true hoʻohui i kēlā me kēia kiʻi o ka inoa like. Ka loaʻa maʻamau false. |
key_id | lālā (nānā) | ʻAʻole | Me kēia olele i haʻi ʻia, a me kēia ʻoe me all_keys=true: kēia wale nō ke ki. |
A'ohe mea pane
{
"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);
Ke ʻimi ʻana i nā noi i ka aka ʻana
ʻO ka hana ʻana, ka loli ʻana, a me ka hoʻopau ʻana i nā pākaukau, ka hōʻuluʻulu akaʻo, a me ka hoʻopukapuka ʻana ma ke ʻano pololei ʻaʻole e pono i kahi pākaukau API. He inoa (signature) mai kou nym kā lākou, no laila, inā hāʻule kahi pākaukau, hiki iā ia ke hoʻohana i ka nui i loaʻa i kona kauka, akā ʻaʻole hiki iā ia ke hana i kekahi pākaukau hou a i ʻole ke hiki i kona nui i luna.
E hana kēia polokalamu iā ʻoe: ka mea a pau i loko o kona API loea kēia mau endpoint. He kēia ʻaoʻao wale nō e hoʻokele ai i nā pīkini mai kou kōkua ponoʻī.
ʻO ka waihona he mea hana Nostr ʻano 27235 (NIP-98), i hoʻouna ʻia ma ke ʻano base64 i ka
Authorization kumu me ka huaʻōlelo Nostr ma mua:
Ka hana nui
{
"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": "..."
}
uHe aha ka URL holoʻokoʻa o ka noi, me ka hoʻohui ʻia ʻana o ka pāʻuna nānā, e like pē me ka loaʻa ʻia ʻia.methodʻo ka hana HTTP.payloadʻO ka SHA-256 o ka ʻōlelo hōʻike kumu, ma ka hex. He mea pono ia ma luna oPOSTaPATCH, a ʻo ka mea e hoʻouna ʻia nei, pono e like pū me ka mea i hāpale ʻia i kēlā me kēia byte.created_atpau pono i loko o nā sekoke 60 mai ka manawa o ka pūnaewele.- Hana pākahi ʻo iaʻuʻu aʻe ʻo ia, a
GETua hoʻohui ʻia, no laila ʻa ʻole hiki ke hoʻihoʻi ʻia kahi ʻulaʻou i ka mea i loaʻa ʻia. ʻO ka unuhi ʻana i kekahi ʻulaʻou hou no kēlā me kēia ʻike ʻōlelo. Hoʻemi i kekahinoncehoʻok标记 me kahi waiwai loli wale no ka mea, ʻo nā unuhi ʻelua i huakaʻi ʻia i ka hola pōmaikaʻi me kaumaha, e loli nō lākou. - Hiki ke loaʻa i ka ʻuhi o kahi ulu ʻia ʻia ke kūʻai i ka nui ʻana i ka 64 KB, a pono ke loaʻa kahi ʻuhi
Content-Type: application/json.
He hana hewa i nalo ʻia ka hana e hoʻi mai ana 401 missing_nostr_auth; ʻo kekahi i hana ʻole i ka pololei, i hōʻihi ʻole i ka pono, i kahiko loa, a i ʻole no kahi URL, ʻano, a i ʻole kumu ʻē aʻe, e hoʻi mai ana
invalid_nostr_auth, me ka manaʻo i loko o ka leka; he mea hoʻohana ʻia hou nō ka mea i hoʻohana ʻia mua e hoʻi mai ana
nostr_auth_replayed. E neʻe ʻia ʻia kahi API key i kēia mau endpoint.
E nānā ʻia ka inoa (signature) a i ʻole ka ʻano i mua ʻole e helu ʻia ka ʻelomi, a hiki i kēlā me kēia ʻāpana ke kūpaʻa i ka pēhea ʻia ʻana i ka hola 30 i ka minaka (ua pili ʻia kahi ʻāpana IPv6 me kona /64 holoʻokoʻa); ma hope o kēlā, e loaʻa... 429 me
Retry-After.
Hiki i nā pāpaho nānā ke kāhea ʻana i kēia mau endpoint mai nā ʻaoao ponoʻī o Nymbot wale nō (https://nymbot.ai,
https://nymchat.app me lā me ko lākou mau pahu i lilo ai. ʻO kekahi ʻaoʻao ma kekahi wahi ʻē aʻe ʻole e loaʻa iauna nā ʻōlelo hoʻohui CORS, no laila ʻole hiki iā ia ke heluhelu i ka mea i hoʻouna ʻia mai lākou. Nā polokalamu a me nā polokalamu maoli, ʻaʻole lākou e hoʻouna i
Origin, ʻa ʻole i kanāwai.
Pono ka ʻimi ʻana i ka mea kī pilikino o kou inoa ʻimeli (ka nsec), i ke koho nei
i mea a pau: kou pilina, kou moʻolelo a me kou loaʻa kālā. Hoʻoili wale i loko o kekahi script ma
kekahi ʻano ʻaoʻao ʻo ia ʻoe e kūpaʻa ai, heluhelu mai ma ka environment ma mua o ka kākau ʻana i loko o ka faila, a
e kūpaʻa i ka app inā hiki iā ʻoe.
Ke kūkulu nei kēia mau kōkua i ke ʻula. ʻO nā laʻaukoea i hiki mai ana ma kēia ʻaoʻao ka mea e hoʻohana ai. Kaila ka piko hunaʻokoa
i ka piko i ka hex mai NOSTR_SECRET_HEX; ʻo ka mea cURL e hoʻohana nei ʻo ka
ʻAe mea hana lālā-kāhea, e ʻae ia i kekahi nsec a i ʻole hex
kī, a me sha256sum (ma 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");
}
Ka hōʻuluʻulu o ka loaʻa loaʻa
He aha kā lāʻaupapa API o ka polokalamu e hōʻike ana ma luna: kou pāʻena pololei, nā pūʻolo ʻelua, he aha ka nui o nā pāʻena e
paʻa ana (ʻaʻole i hāʻule ʻia a i ʻole i loaʻa ka wā e kūpono ai), a me ka hoʻopunipuni pololei koho, a
null i ka wā e ʻole ai ka papa ʻōpala e hāʻawi iā lākou.
GET https://nymbot.ai/api/v1/account — pono i he olelo i ʻōlelo i hōʻike ʻia.
A'ohe mea pane
{
"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());
Ke hoʻokele ʻana i nā pākaukau
Nā pahu ma hope o ka papa inoa pūnaewele o ka polokalamu. Pono iā lākou a pau he inoa ʻia ono ʻike ʻāpana. ʻO kēlā me kēia kiʻi e hoʻi mai ana ma kēia mau ʻano, me nā manawa i loko o ka ISO 8601 a me nā nui i loko o nā sats:
Kumu mea mea waiwai
{
"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 He nui ka ʻike i ka ʻike ʻana i ka kī akā ʻaʻole ka hoʻohana ʻana i ia. ʻO ka kī pono i ka hāʻawi ʻia ʻana i ka mea hoʻokahi wale nō, i ka wā i hana ʻia ai.
Keenaʻimi i nā ki 🔑
GET https://nymbot.ai/api/v1/keys Kalima ʻia
| Māhele | ʻOlelo | Pono | Kāʻano |
|---|---|---|---|
include_revoked | boolean (nā nānā ʻana) | ʻAʻole | Hoʻokolu i nā pākaukau i wehe ʻia. Ka pūʻolo. false. |
A'ohe mea pane
{ "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);
ʻO ka hana ʻana i kahi pohaku
POST https://nymbot.ai/api/v1/keys — ʻoiaʻiʻo. Heia nā mea e tali mai ana 201.
| Māhele | ʻOlelo | Pono | Kāʻano |
|---|---|---|---|
name | lele | ʻAe | 1 a 40 mau helu ʻōlelo, ʻole paha e like me kāu mau pūnaewele hou aia i kēia manawa (haʻalele i ka ʻano ʻōlelo). |
limit_sats | helu pololei | ʻAʻole | Ke kākoʻo kākoʻo kākoʻo ʻana i ka nui o ka kākoʻo i nā sats, ʻo ia paha ʻo 1. ʻO ia paha ʻole ke kākoʻo ʻana i ka nui ʻole. |
reset_period | lele | ʻAʻole | daily, weekly aʻole monthly. Makemake limit_satsE haʻalele ia no he pāpā ʻole e hoʻiia mai ana. |
expire_at | inoa a i ʻole ʻo ia he helu | ʻAʻole | I ka manawa e ʻole ai ka hana o ka kī: he manawa ISO 8601, a i ʻole nā milisekonas mai ka makahiki 1970 mai. |
Pane (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"
}
}
| Kālele | ʻAeʻe? |
|---|---|
400 | He inoa i nalowale ʻole ʻia a i mea ua lōʻihi loa; he inoa i loaʻa mua ʻia (duplicate_name); he pākuʻi ʻole he helu piʻi ʻole i kikoʻī ʻia ʻo ʻole he ʻeha ma luna o ka ʻeha ʻokahi; he manawa hoʻoponopono ʻole me kahi pākuʻi; he manawa pahala i ka wā i hala nei; he luna ʻole ʻole ka papa ʻike (unknown_parameter); a i ʻole 25 mau pohona hana nei (too_many_keys). |
429 | He ʻoi aku ma mua o nā pīkini 60 i hana ʻia e kēia inoa, a i ʻole 120 mai kēia ʻelepani, i loko o kahi hola (rate_limit_exceeded, me 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);
Heluhelu i kahi kī
GET https://nymbot.ai/api/v1/keys/{id} Kalima ʻia
Nā mea e hoʻi mai ana {"data": {…}} me ka mea kī, a i ʻole 404
key_not_found Inā ʻaʻole he pīkini kou e loaʻa ana i kēlā 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);
Hoʻololi i kekahi pohaku
PATCH https://nymbot.ai/api/v1/keys/{id} Kalima ʻia
E hoʻouna i kekahi o name, limit_sats, reset_period a
expire_at, me nā kānāwai like me ka hana ʻana i kahi hola. null hoʻoponopono i kahi
papa: ʻole ka pio, ʻole ka hoʻoponopono hou, ʻole ka pau ʻana. ʻO ka loli ʻana i ka manawa hoʻoponopono hou e hoʻomaka ai i kahi manawa hou ma ka zero. ʻAʻole hiki ke loli i kahi pāpā i hāʻawi ʻia ʻole (400 key_revoked). Hoʻi mai
{"data": {…}} me ka mea kī hou ʻia.
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);
Hoʻopau ʻana i kekena
DELETE https://nymbot.ai/api/v1/keys/{id} Kalima ʻia
Hoʻopau koke i ka pīkini, no ka loaʻa mau ʻana. Noʻonoʻo i ka papa inoa me revoked_at hoʻokomo ʻia, a hiki
ke ʻike ʻia me include_revoked=trueʻO ka hoʻokuʻu ʻana i kekahi pīpīhau i hoʻokuʻu ʻia mua ʻo ia pēlā nō ka pane ʻana. ʻO nā pīpīhau 50 i hoʻokuʻu ʻia i luna loa wale nō ke loaʻa ʻia; ʻāʻole loa ʻia nā kahiko i ka wā e hoʻokuʻu ʻia ai kekahi pīpīhau ʻē aʻe.
A'ohe mea pane
{ "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
Hoʻopili i kahi waiwai Lightning me ka Nostr Wallet Connect a hoʻopunipuni ʻia e Nymbot ka waiwai i ka wā e pau ai ka hoʻohana ʻana i ka API. He mau hoʻonohono like nō kēia i ka pepa API o ka polokalamu; kēia nā puka puka i loko pono ʻia. Pono nā mea a pau i ka olelo i ʻōlelo i hōʻike ʻia.
Pehea ia e hana ai: ke hoʻonāuna ʻia ka unuhi API ma ka pūnaewele i ko ʻoe i koho ai e nānā ai, inā ua haʻalele kēlā pūnaewele iho o kou kumu kūʻai, e hana i kekahi ʻunuhi ʻia e Nymbot no kou nui uku, e nānā i kou pūkena e uku ai, a e hoʻemi i ka uku. He mea hoʻopukupuku ʻia ia i ka ʻole o ka ʻekolu i nā minuke he umahana no kēlā nym a me ka pūnaewele, no laila ʻaʻole hiki i ka nui o nā unuhi ke hoʻopau i ka pūkena. ʻAʻole ka hoʻohana ʻana i nā polokalamu e hoʻomaka ai i kēia. ʻO ka manawa a me ka nui o ka uku i loaʻa i ka wā hope loa, a me ka hewa i loaʻa i ka wā hope loa, e loaʻa nei i nā loea; inā ua loaʻa ka uku ma hope o kekahi hewa, e nānā i kona ʻunuhi me ka hiki ʻana o ka hoʻopunamuna ʻana mea kūpono ia ia.
Ke kumu hoʻopili e loaʻa iā ia ka mea i ka mea e nīnau ai i kāu pūkeniuka e kākoʻo ai i ka nei. Nymbot
hoʻohana i ka hūnā ʻia ʻana o ia mea a e hoʻohana wale ʻia no ka kākoʻo ʻana i nā bilu kākoʻo iho, akā hana i
hoʻopili no kēia wale nō, me kahi kālā kākoʻo i loko o kāu pūkeniuka, i mea e loaʻa ai ka nui loa hiki ke
kākoʻo ʻia he helu i ko ʻole ʻia e ʻoe. Pono ka pūkeniuka e kākoʻo i pay_invoice.
Ke hoʻopili ʻana i kekahi pūnaewele waiwai
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Kalima ʻia
| Māhele | ʻOlelo | Pono | Kāʻano |
|---|---|---|---|
nwc_url | lele | ʻAe | Ke lālā hoʻokoneʻi, e hoʻomaka ana nostr+walletconnect://. Naʻauao Nymbot e nānā ai i ka puku waihona no get_info ahi i ka hoʻ保存 ʻana ʻana, a hoʻohana i ka hūnā ʻana i ka ʻike. |
threshold_sats | helu pololei | ʻAe | Hoʻopuna i ka loaʻa inā ʻoi aku ka ʻole o kēia mau sats. Ka ʻoi loa ʻo 1,000. |
topup_sats | helu pololei | ʻAe | Pehea ka nui e hoʻemi ai i kēlā me kēia manawa. 1,000 a hiki i ka 1,000,000 sats. |
tier | lele | ʻAʻole | pro (ka mea kapa ʻia ʻia) a standard: ka loaʻa e nānā ai a e hoʻoponopono ai. |
A'ohe mea pane
{
"data": {
"connected": true,
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
"last_topup_at": null,
"last_topup_sats": null,
"last_error": null
}
}
| Kālele | ʻAeʻe? |
|---|---|
400 | ʻAʻole he lālā hoʻopili (invalid_nwc_url); ʻaʻole i pane mai ka pūkena ma kona pūnaewae (nwc_unreachable) a i ʻole kūʻai i ka nānā ʻana (nwc_rejected); ʻaʻole hiki i ka lōkahi ke kālā i nā pepa loaʻa (nwc_missing_permission); a he nui i waho o nā loaʻa. |
501 | ʻAʻole i hoʻonā ʻia nā hoʻokomo waiwai i kēlā me kēia manawa no kēia server (nwc_unavailable). Pono pēlā no nā ʻaoao ʻelua ʻimi ʻia. |
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());
Alekāpū ʻana i nā hoʻonohonoho
GET https://nymbot.ai/api/v1/nwc-auto-topup Kalima ʻia
Hāʻawi mai i ka mea pēlena like ʻia me ka hoʻopili ʻana, me connected: false me nā luna ʻehapi ʻē aʻe
null Inā ʻaʻole i hoʻokoneʻi ʻia kekahi pūʻokoʻa. ʻAʻole e hoʻi mai pē ka lālā hoʻokoneʻi.
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());
Kūʻai ʻana i ka lilo ʻana
DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Kalima ʻia
Hoʻopau i ka lālā kī kānelike i hoʻumālama ʻia. ʻAʻole e hana hou i nā hoʻopukapuka ʻana. No ka ʻoiaʻiʻo, hiki iā ʻoe ke wehe i ka lālā kī kānelike ma luna o kou pūkeni.
A'ohe mea pane
{ "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());
Ke kākoʻo ʻana ma o nā ulu ʻia ʻole me ka ʻeke
Hiki ke uku ʻia nā hopena kiʻekiʻe kūpono no kahi ulu ʻia i kēlā me kēia manawa ma luna o Lightning, me ka ʻole o kahi puka,
me ka ʻole o kahi akaunaka a me ka ʻole o kahi pūnaewele: POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations a POST /embeddings. He ʻimi pono mau nō nā Kamaʻilio, nā ʻOluʻolu, a me nā>:
Pūnaewele, inā loaʻa kekahi ʻimi, e pili ana ka uku i ka pūlua me ka noʻeau;
e hoʻomaka wale ka ala uku inā ʻole he ʻimi i hoʻouna ʻia.
Nymbot e ʻōlelo ana i ʻelua mau ʻano o ka manaʻo pēnei, mai kahi pūnaewele hoʻokahi: o Lightning Labs'
L402 (a me ka inoa kahiko pū kēia i loaʻa ai, LSAT) a me ka draft a ka IETF
Ka uku Ka pololei o ka hoʻohana ʻana i ka ʻano hōʻoia HTTP me ka lightning ka manaʻo a me
charge manaʻo. Hoʻohana i ka mea ʻoiaʻiʻo i ka mea e ulu ai kou mea kūʻai.
ʻO ka uku ʻole i kahi pīkini, he mea nō ia i ʻike ʻia ma ka manawa he pāʻea wale nō ia API_L402_SECRET He ʻoi aku ma mua o nā byte 32 loli ʻole, ma ke ʻano hex (64 mau helu) a i ʻole base64 (44). Haku i kekahi me openssl rand -hex 32ʻO ka waiwai lalo a i ʻole ka waiwai hiki ke ʻike ʻia e hāʻawi i ka hoʻopau ʻana i ka mea hana a kākau pū i ka manaʻo no ka mea. No ka hoʻoweliweli ʻana i ia, lawe i ka waiwai kahiko i loaʻa i API_L402_SECRET_PREVIOUS no ka lā e like me: nā manaʻo hoʻoholo, nā URL o ka hiki ʻana a me
nā pilikia i hana ʻia ma kona ʻisy e mau ana hiki i ka wā e loaʻa ai ka lehulehu ʻole.
Ka hana nui
Hoʻouna i ka noi me ka ʻole Authorization uluʻulu. Inā kūpono ia, ʻaʻole e hana kahi mea, a e loaʻa iā ʻoe 402 Payment Required me ka pepa uku no ka nui maopopo o ka uku o kēlā noiʻi: ka nui uku pēnei i ka mea e uku ai kekahi 'key', i hoʻolili ʻia ma 10 sats no ka 'standard credit' a i ʻole 100 sats no ka 'Pro credit' a i hoʻonui ʻia i ka hopena sat (ka ʻoi aʻe ʻo 1 sat, a me ka ʻoi aʻe ʻo 0.05 credit ka nui ʻole). ʻO ka pane e lawe ana i nā kolu WWW-Authenticate nā pilikia no ka pepa loaʻa pēlā:
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 }
}
Ka Kaʻuʻu ʻana i ka Pūmoney request he mea kumu JSON base64url kēia:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
He pilikia e pili ana i ka hopena, i ka Content-Type (ka ʻano media o ia a, no ka multipart, kona pāuna) a i ka SHA-256 o nā byte kūpono o ka kino i hoʻouna ʻia, a e noho ana no 15 minuke. Ma hope o ke kālā ʻana, hoʻouna i ka pāpaʻa like e noi hou: ʻo ia pēlā
Content-Type me nā byte JSON pēlena, a i ʻole no nā hopena multipart
(/images/edits, /audio/transcriptions, /audio/translations)
ka mea pūʻulu like me ka pūʻulu kiʻi like me ka pale ʻāpana like. Ke koho ʻia e nā pahu HTTP hou kahi pale ʻāpana i kēlā me kēia
manawa e hoʻopaʻa ʻia ai kahi pālua, no laila e hoʻopaʻa i ka ʻana i kapa ʻia he una a e hoʻouna i kēlā mau ʻikepili i loko o nā manawa ʻelua.
ʻO ia ʻana ʻo ia nōna mea hiki ke unuhi i nā ʻāpana (challenges) ʻimene 30 i ka minaka (hōʻike ʻia ka ʻana IPv6 ma ke ʻano he /64 holoʻokoʻa). ʻO nā unuhi i ʻaʻole ʻike ʻia ka ʻana, he 10 i ka minaka kikoʻī aʻe lākou, a he loaʻa nui nō pū kekahi no nā ʻāpana i hāʻawi ʻia e Nymbot ma nā ʻana a pau; ʻaʻole lawe ʻia i loko o ia inā lawe ʻia ka unuhi ʻaʻole i hāʻawi ʻia ka ʻāpana (no ka laʻana, inā ʻaʻole kūpono ka JSON). Ma hope o kēlā, ʻo ka pane ʻia ʻo 429 me Retry-After, i ke hoʻouna ʻia mua o ka heluhelu ʻana i ka kumu. ʻO nā
hopuna i kahea ʻia me ka ʻole o kahi kiʻi a i ʻole kākoʻo me ka ʻole o ka ʻike, e loaʻa pū kekahi i ka nui kūlohelohe o ka 120
nā unuhi ʻole i ka minuke no kēlā me kēia ʻāpana. E nānā ʻia ka kākoʻo mua o ka heluhelu ʻana i ka kumu, a he unuhi i ka mea e Content-Type ʻaʻole ia application/json (a ʻo
multipart/form-data no nā hoʻouna) ua kūʻē ʻia me 415 a me he ne‘ole loa
he invoice.
Ke kumuwaiwai o nā embeddings he ka helu ʻana mai ka ʻano ʻike ʻia o nā token i loko, me ka 1.5× mea hoʻonui, no ka mea ʻaʻole ʻia ka helu maoli a hiki i ka hope loa. ʻO nā token i hoʻohana ʻia maoli kāu kākoʻo, a ʻo ka ʻāpana i ʻole i hoʻohana ʻia o ke kākoʻo e hoʻi mai ana ma ke ʻano he hoʻi mea loaʻa ka pūnaewale.
Hoʻouna ana i ke uku
E pilikia ka invoice me kekahi pūnaewae Lightning. E hāʻawi ana ka pūnaewae iā ʻoe i ka preimage, 64 hex characters. E ala ʻole e hoʻouna ai i ka ulu ʻoe me kekahi o kēia:
| Hoʻolālā | Kokua Kumu |
|---|---|
| L402 | Authorization: L402 <macaroon>:<preimage> (LSAT hana pū nō ʻoe) |
| Ka uku | Authorization: Payment <base64url JSON>, ma hea ka JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}} |
He noiʻi i uku ʻia he mea e pane ana e like pēlā me kekahi mea i hana ʻia me kekahi pūnaewele, akā ʻo ia ka mea e... nymbot
ʻaʻole i loaʻa mau nā luna kālā i ka mea: {"payment": "l402", "tier": "pro", "paid_sats": 237,
"charged_sats": 237}, a me ʻole he mea ʻole X-Nymbot-Balance-Sats kokua. A
he noi i ukuia me ka Papa Kumu ʻIke ʻOluokuloko e loaʻa pū kekahi Payment-Receipt palahea (base64url JSON me ka ʻōlelo hōʻike o ka challenge id, me ka payment hash ma ke ʻano he reference, status a
timestamp). ʻAʻole pili nā unuhi uku i kekahi inoa, no laila ʻole lākou e hōʻike ʻana i loko o ka
moʻolelo nānā ʻia.
| Kālele | ʻAeʻe? |
|---|---|
402 payment_already_used | ʻO kēlā ʻaoʻao uku a pau, he uku ia no kekahi noi. ʻO ka pane kekahi pilikia hou no kēia noi, no laila ʻo ka mea kūʻai e mālama ana i kāna ʻikepili i ka wā kahiko (e like me lnget ke kumu wale nō e kālā hou ana. |
402 payment_mismatch | Ua hāʻawi ʻia ka ʻikepili hōʻoia no kekahi ʻaoʻao ʻē aʻe, Content-Type a ka kino, a ʻoi aku ka uku ma mua o ka uku o kēia ʻōlelo i kēia manawa. He kūlana hou kēia no kēia ʻōlelo e hiki mai ana; inā liʻiliʻi loa ka uku, e hoʻi mai ana ka mea i uku ʻia e like me kahi hoʻi mea loaʻa ka pūnaewale (refund_token a refund_sats i loko o ka kino). |
402 payment_expired | Ua hala ʻoi atu i ka 15 minitua mai ka hoʻohāpana ʻana. He hoʻohāpana hou ke hiki mai me ia. Inā hōʻike ka preimage ua uku ʻoe, e hoʻi mai ana ka mea i uku ʻia e like me he a hoʻi mea loaʻa ka pūnaewale (refund_token a refund_sats i loko o ka kino), ʻole; ua hoʻohana ʻia kēlā mea kūpono ma hope. |
401 invalid_preimage | ʻAʻole ka preimage e hāʻawi ana i ka hash o ka invoice. ʻAʻole hoʻohana ʻia ka uku. |
401 invalid_payment_credential | He hewa ka ʻimi ʻāpana, ua loli ma hope o ka hāʻawi ʻana a Nymbot, a i ʻole he inoa paha ia o kahi ʻimi kālā i ʻole i hāʻawi ʻia e Nymbot ma o kahi pepa uku. ʻAʻole e loaʻa kahi macaroon i loaʻa i Nymbot kahi ʻōlelo kūʻē, a i ʻole me nā ʻōlelo kūʻē kūʻē ʻia. |
429 rate_limit_exceeded | He 30 ʻoi aku ma mua o nā pūʻāʻawa a i ʻole nā pīkini i kūleʻa i ka hōʻoia ʻana i loaʻa mai kēia ʻaoʻao i loko o ka minaka kanavelua, a i ʻole ua hoʻouna ʻia kekahi pūʻāʻawa hoʻiʻole i ʻoi aku ma mua o ka 60 manawa i loko o ka minaka kanavelua. E kali i... 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"));
Poʻe mea kūʻai hoʻokumu ʻia ma luna o mppx me kahi ala Lightning e hoʻopau ai i ka pilikia i ka ʻAowai ʻana i ka ʻuve; e hoʻpointing i ka hopena a e allowa iā lākou e kākoʻo ai.
Nā wikiō
He uku ʻia POST /videos nā pane 202 pēlā me kekahi mea i kī ʻia, a me kekahi a
status_url: GET ʻole ia kekahi ala e hiki ai ke mālama i ka hana. Ua inoa ʻia ia a e hana ana no nā hola 24, ma o ka mālama ʻana i ka hana.
{
"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..."
}
}
E mālama i ka refund_token mai kēia pane: he ʻoia wale nō ke hōʻike ʻia ma kēia wahi. He pōʻole ia i ka wā
e hana ai ka wikiō (GET /api/v1/l402/refunds nā pane "status": "pending");
inā lēlea ka hōʻike ʻole i ka uku, e loaʻa ana ka uku ma ia ia. Hōʻike ʻia e ka URL o ka waiwai
refund_sats No kahi hana i hoʻiʻole ʻia ka kālā akā ʻaʻole i loaʻa ka hōʻailona, ʻaʻole hiki ke hōʻike i ka hoʻiʻole ʻia o ka kālā ma o ka URL o ka hiki ʻana o ka hana. ʻO ka nānā ʻana i ka hōʻailona, e hoʻoponopono pū ana i kahi hana i kūleʻa ʻole i ʻole i nānā ʻia e kekahi kanaka.
Nā hoʻoikaika kālā
Inā hāʻule kekahi noi i kālā ʻia a ua uku ʻia ʻo Nymbot e ka mea ʻoiaʻiʻo no ka hoʻāʻo, e mālama ʻia ka uku a e ʻōlelo ʻia kēlā ma ka hewa, me charged_sats, e like pēlena i kahi ʻōlelo pili ʻia. Inā hāʻule
me ka ʻole o ka uku ʻana, e lawe ka hewa i he hoʻi mea loaʻa ka pūnaewale kūpono i ka uku ʻia ʻia:
{
"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"
}
}
He mau ʻana ʻole i hoʻohana ʻia e hoʻi mai ana i ka ʻano like pēlā: inā ulu ʻia ʻo nā kiʻi ʻelua a lilo kekahi i ka mea ʻole i kākoho ʻia,
ʻo ka pane kūpono o nymbot ʻo ka mea kūʻokoʻa e lawe ana i kahi pūnaewele hoʻoulu no ka mea i nalowale;
he unuhi e neʻe ʻole ai ka ujemena i ka wā mua, e hoʻohana ʻia ka uku no ka lōʻihi loa o ka faila
(ʻaʻole e ʻoi aku ma mua o 30 minuke), a ʻo ka ʻikepili i loaʻa ma waena o ka lōʻihi maoli a me ka ulu ʻana, e hoʻi mai ana ma ke ʻano
he pūnaewele hoʻoulu; inā ʻoi aku ma mua o 30 minuke, e lawe ʻia ʻia me 413
a me ka malu o ka uku pili loa eia mai. He mea e hoʻihoʻi ʻia e nā embeddings ka mea i loaʻa ʻole i ka nānā ʻana. ʻO ka mea i hāʻawi ʻia i ka video i lapaʻau ʻia, he hoʻihoʻi ia i ka token i hāʻawi ʻia i ka hoʻohaklama ʻana.
He holauna hoʻoikaika ʻo ia he kōkua 256-bit ʻole ʻia. Ke mālama wale ʻia e Nymbot ka hāʻawi pono, a e nalo ia ma hope o nā lā 30. He loaʻa iā ia kahi hoihoi sat, a hiki iā ʻoe ke:
- E kālele me ia. Hoʻouna
Authorization: Bearer REFUND-…ma nā hopena a pau i luna aʻe (kaona ʻia e ka OpenAI SDK ma ke ʻano he API key). He mea nā uku mai ka ʻikepili token a e noho ana ka mea i loaʻa i luna o ia (refund_token_satsi loko o kanymbotmea hana). He kīwai i ʻoi aku ka uʻi ma mua o ka unuhi ʻana i nā pane.402refund_insufficient; he hapa ʻole i ke uku ʻia ʻole e hoʻihoʻi i nā sats i ka token pēlā pū. - E nānā i ia.
GET /api/v1/l402/refundsme ka pūʻulu pū hoʻi mai{"sats": 237, "status": "open", "expires_at": "..."}. - Hiki ke hoʻohana ʻia he token i ka nui loa ʻo 60 mau manawa i ka minuke.
- Move i loko o ka nym. Paʻaki i loko o E ʻimi kūʻai i ka makana i loko o ka
Nymbot app, a ke kele ʻana
POST /api/v1/l402/refunds/redeemme he olelo i ʻōlelo i hōʻike ʻia a{"refund_token": "REFUND-...", "balance": "standard"}(a ʻo"pro"). Hele koke ke kūleana i ka pūnaewale (10 sats kēlā me kēia ma standard, 100 ma Pro); nā sats ʻole e hana i kahi kūleana holoʻokoʻa e noho ana ma ka token no nā nānā 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"
A'ohe mea pane
{ "data": { "credited": 23, "tier": "standard", "balance_credits": 123, "remaining_sats": 7 } }