Batayan ti pannakaammo Developer iti
Naaddaankami iti top-ups ken keys.
Ikonektartayo ti inaramidko, ipatpatpatulod iti Lightning, ipatpatulod iti automatiko manipud iti inaramidko a wallet, ipatulodda ti inaramidko ti tunggal request, ken ipatulod kadagiti key manipud iti code.
Daytoy a panid ket naipatarus babaen ti makina para iti kombeniente. Ti Ingles nga orihinal ti bersion nga agaplikar.
Ituloymi daytoy balanse
Ipapaupana ketdi ti kaaduan kadagitoy no kalgaw.
GET https://nymbot.ai/api/v1/credits/balance Naaddaankami iti API Key. POST Ngem saan a nagpateg a nagpateg ti customer a nagpategda.
balance Kuna ti dua a balanse iti dolyar iti current Bitcoin price, para kadagiti instrumento a naaddaan iti tunggal numero (null Ti rest ket iti Credits and Sats, a kas iti panangmatmat dagiti balanse. key Napateg ti key a saan a makakita iti salun-at.
Reaksiona
{
"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 iti | ti |
|---|---|
401 | Ti key ket saan, ket inaramid, ti inaramid, ti inaramid, ti inaramid. |
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);
Nagpateg a metodiko
Kasano a maaddaan iti panagrang-ay, ken ti limitasion. Lightning isu ti tunggal metoda.
GET https://nymbot.ai/api/v1/topup/payment-methods Ket saan a nangaramid iti key.
Ti top-up ket ti 10 a 1,000,000 a sats; ti Pro top-up ket naaddaan iti ad-adu pay iti maysa a Pro credit, para iti 100 sats. bulk_bonus Kuna ti extra credit iti bigger top-ups, kas iti app: 10%, 15% wenno 20% iti standard top-ups manipud 500, 1,000 wenno 5,000 sats, ken iti Pro top-ups manipud 5,000, 10,000 wenno 50,000 sats.
Reaksiona
{
"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);
Naaddaankami iti Lightning
Adda pay laeng ti sumagmamano a makisarita iti maysa a kasayaatan a kasayaatan a kasayaatan. Kitaen dagiti ladawan. Naaddaankami iti credit.
POST https://nymbot.ai/api/v1/topup/create/btc-lightning Naaddaankami iti API Key.
| Campo ti | ti | Naaddaankami | Kitaen dagiti ladawan. |
|---|---|---|---|
amount | Numero ti | Wen | Isu laengen ti, in currencyNabautisaran ti sumagmamano iti sats. |
currency | String iti | Ket | SATS Kitaen dagiti ladawan. USD ti BTCDollari a konverted iti current price ti Bitcoin. |
tier | String iti | Ket | pro Kitaen dagiti ladawan. standard: iti maipapan iti balanse ti kredito. |
Ti standard a credit ket 10 sats ken a Pro credit 100 sats, plus dagiti bonus a bulk;
credits Adda pay laeng ti sumagmamano a sumagmamano.
Reaksiona
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"payment_request": "lnbc100u1p5...",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": "2026-09-30T09:27:00Z",
"status": "pending"
}
| Status iti | ti |
|---|---|
400 | Kitaen dagiti ladawan. (unsupported_methodMaanadantayo dagiti kabaketan a pagsasaotayo (unsupported_currencyTi maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua ni Abraham.amount_too_small(Tumaudto dagiti sumaganad a saludsod.amount_too_largeDaytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.amount_out_of_range). |
429 | Agtawenak idi iti 120 a tawen ti napalabas a tawen (rate_limit_exceededti Retry-After). |
502 | Maanadantayo dagiti kabaketan a pagsasaotayo (invoice_unavailableti 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);
Nagturong iti top-up.
Inlawlawagmo no ania ti inlawlawag ti inlawlawag ken, saankayo, inlawlawag ti credit. Checking isu ti inlawlawagna, saankayo nga inlawlawagna, check until the status is creditedNapateg a check it again ngem sigurado: ti kredito ti panagturay, saan a kaduana ti panagturay.
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - ti kaadu ti key manipud iti nym nga inaramid ti invoice.
status ti pending (Nakaadantayo dagiti kabaketan a pagsasaotayo) paid Ket, inton napudoten ti init, ti mana a nabati iti daga marunawen. credited Isu ket pimmusay idiay asideg ti Edinburgh. expired Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.
Reaksiona
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| Status iti | ti |
|---|---|
400 | Ti id ket saan a 64-karakter nga id iti creation call. |
404 | Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.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);
Umadawtayo iti historia
Ti maysa a rida para iti solicitation: ti ania a modelo, ania a token ken ania ti costna. Ti saan a prompts wenno answers ket naidumduma, saan a saan a naidumduma. Ti rida ket naidumduma iti 90 nga aldaw, ti maudi a naidumduma.
GET https://nymbot.ai/api/v1/queries/history — ti kaaddaan iti API key, a makita ti maysa a requests, wenno a Agbiruk iti peticion. Napateg ti pammadayawna, ta saan a makita dagiti dadduma.
| Campo ti | ti | Naaddaankami | Kitaen dagiti ladawan. |
|---|---|---|---|
page | Agbiruk iti Query. | Ket | Ti default ket 1, iti maximum a 1,000; ti maysa a panid ket 400 invalid_value. |
page_count | Agbiruk iti Query. | Ket | Agtawenak idi iti 20 a tawen, agtawenak idi iti 100. |
start_dateend_date | Agbiruk iti query. | Ket | Ti ISO 8601 ket addaan iti data. |
model | Agbiruk iti query. | Ket | Napateg ti model. |
type | Agbiruk iti query. | Ket | chat, responses, messages, image, video, speech, transcription ti embedding. |
all_keys | Daytoy ket isu ti Query. | Ket | Addaan iti key: true Naaddaankami iti maysa a pammadayaw a pammadayaw.Default false. |
key_id | Agbiruk iti query. | Ket | Isu ket pimmusay idiay asideg ti Edinburgh. all_keys=trueKasta ti key. |
Reaksiona
{
"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);
Kitaen dagiti ladawan.
Ti makina, mabasa ken revoking a key, ti account summary ken automatic top-ups, ket saan a makisarita ti API key. Makisarita ti asinami iti nym, tapno ti makisarita a key ti makisarita iti kaputotan, ngem saan a saan a makisarita iti kaputotan.
Ti app ket naaddaan iti daytoy: ti amin a Pimmanaw Napateg ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset.
Ti sinurat ket maysa a Nostr evento ti tipo 27235 (NIP-98), a nailawlawag iti base64-coded.
Authorization Nagpintasen ti palabra Nostr Para iti front:
ti event
{
"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": "..."
}
uDaytoy ket addaan iti maysa nga addaan iti maysa a sebbangan, a ti maysa a sebbangan ket maysa a sebbangan.methodDaytoy ti HTTP Method.payloadTi SHA-256 ket isu ti SHA-256 ti Raw Request Body, iti hex.POSTkenPATCHDaytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.created_atNaaddaankami iti 60 a segundo ti timek ti server.- Ngem saan a nagpateg a
GETDaytoy ket addaan iti kaaduan kadagitoy no kalgaw.Isipudnona dagiti dadduma.nonceNapateg a dua a peticion a nairekord iti maysa a segundo. - Ti corpo ti sinurat a peticion ket addaan iti maximum a 64 KB, ken ti corpo ket nangisurat.
Content-Type: application/json.
Naaddaankami iti missing event. 401 missing_nostr_authTi maysa a malalaknib, malalaknib, isu met laeng, wenno para iti sabali a URL, metodo, wenno body returns.
invalid_nostr_authIbaga kadatayo ti Nasantuan a Surat a saantayo a madanagan.
nostr_auth_replayedTi sinurat ket checked para iti pananglitan ti organo, ken ti tunggal address ti makaparagsak iti 30 a minuto (ti IPv6 address ket kalpasanna /64); ngem saan a makaparagsak iti 30 a minuto. 429 ti
Retry-After.
Nalawag ti kuna ti Biblia: “Asinoman a mangay-ayat iti kinaranggas pudno unay a guraen [ni Jehova].https://nymbot.ai,
https://nymchat.app Daytoy ket addaan iti kaaduan kadagitoy no kalgaw.Idi linuktan ti kaaduan kadagitoy no kalgaw.
OriginDaytoy ket saan a nakakita.
Ngem saan a naaddaan ti secret key ti NIM. nsecTi maysa ket addaan iti maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua ni Jehova.
Kas pagarigan, adda makaay-ayo iti maysa a paset ti maysa a pagilian. NOSTR_SECRET_HEXDaytoy ket addaan iti maysa a sebbangan.
Nagpintasen Daytoy ket addaan iti maysa a command-line tool, a ti maysa ket maysa a nsec o hex key. sha256sum Addaan iti 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");
}
Agbiruk iti account.
Kas iti app’s API sheet ti ipakita: ti publiko a key, dua a balanse, innem a keys ti aktibo (non revoked wenno umad-adu), ken ti Automatiko ti top-up. Nalainganna dagiti dadduma.
null Ngem saan a ti server ket inaramidda.
GET https://nymbot.ai/api/v1/account Naaddaankami iti Agbiruk iti peticion..
Reaksiona
{
"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());
Nalaing dagiti keys.
Napateg dagiti pangulo ti pangulo ti app. Naaddaankami iti Agbiruk iti peticion.Ti tunggal key ket returns iti daytoy a formulario, iti times iti ISO 8601 ken sumagmamano iti sats:
Objektona iti
{
"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 Saan a maaddaan ti key, ket saan a maaddaan ti key, ngem saan a maaddaan ti key.
Napateg dagiti keys
GET https://nymbot.ai/api/v1/keys Naaddaankami iti
| Campo ti | ti | Naaddaankami | Kitaen dagiti ladawan. |
|---|---|---|---|
include_revoked | Daytoy ket isu ti Query. | Ket | Napalalo ti inaramidna.Default. false. |
Reaksiona
{ "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);
Naaddaankami iti key
POST https://nymbot.ai/api/v1/keys Naaddaankami iti regreso. 201.
| Campo ti | ti | Naaddaankami | Kitaen dagiti ladawan. |
|---|---|---|---|
name | String iti | Wen | 1 agingga iti 40 a karakter, naaddaan iti dadduma pay a active keys (ignoring case). |
limit_sats | Napategda | Ket | Nagsaludsodda iti maysa a pasamak, ket inaramidna ti 1. |
reset_period | String iti | Ket | daily, weekly ti monthlyNaaddaankami limit_satsNgem saan a maipakitatayo ti kaputotan a saan a maipakitatayo ti kaputotan. |
expire_at | Napateg ti integer. | Ket | Idi naaddaan ti key: ti ISO 8601 a oras, wenno milisegundas manipud idi 1970. |
Agtawenak idi (2011)
{
"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 iti | ti |
|---|---|
400 | Nalaing ngamin idiay ayan ni Insan Crist ket isu a sabali dayta isemmo.duplicate_nameTi maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua ni David. (unknown_parameterMaanadantayo dagiti kabaketan a pagsasaotayo (too_many_keys). |
429 | Ti maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua ni David (rate_limit_exceededti 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);
Kitaen dagiti ladawan.
GET https://nymbot.ai/api/v1/keys/{id} Naaddaankami iti
Naaddaankami {"data": {…}} Isu ket isu ti objekto, wenno 404
key_not_found Ngem saan a naaddaan ti 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);
Naaddaankami iti key
PATCH https://nymbot.ai/api/v1/keys/{id} Naaddaankami iti
Addaan iti name, limit_sats, reset_period ken
expire_atNaaddaankami iti maysa a key. null Daytoy ket addaan iti kaaduan kadagitoy no kalgaw, ket addaan iti kaaduan kadagitoy no kalgaw. (400 key_revokedNaaddaankami iti
{"data": {…}} Ngem saan a naaddaan ti key object.
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);
Napateg ti key.
DELETE https://nymbot.ai/api/v1/keys/{id} Naaddaankami iti
Naaddaankami iti daytoy a list, saan a naaddaankami iti list. revoked_at Ngem saan a makita ti include_revoked=trueTi panagturay ket addaan iti lima a tawen a mangparegta iti panagturay.
Reaksiona
{ "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());
Daytoy ti NWC Auto-top-up.
Kas pagarigan, adda makaay-ayo iti panagrang-ay iti panagrang-ay iti panagrang-ay iti panagrang-ay. Agbiruk iti peticion..
Kasano a nagtrabaho: kalpasan ti inlawlawag ti API iti balanse a pimmanaw a pimmanaw, no isu ti balanse ket naparegta iti pimmanaw, inlawlawag ti Nymbot iti inlawlawag ti sumagmamano a top-up, inlawlawag ti wallet iti pagbayadda, ken inlawlawag ti credito. Inlawlawagna iti maximum kada 5 a minuto para iti tunggal niam ken balanse, tapno maaddaan ti inlawlawag iti wallet. Inlawlawagna iti app ket inlawlawagna ti inlawlawagna. Ti oras ken dimensiona ti naparegta a top-up, ken ti naparegta a error, adda iti settings; no ania ti inlawlawagna iti inlawlawagna, inlawlawagna ti inlawlawagna. Ti top-up ket Kredito iti.
Ti Nymbot ket naidumduma iti encrypted ken saan a nausar iti pagbayad ti maysa a top-up invoice, ngem ti panangidumduma a koneksiyon ket para iti daytoy, babaen ti maysa a gasto a budget iti wallet, tapno maaddaan ti maysa a numero a pagbayadda. pay_invoice.
Agbiruk iti wallet.
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Naaddaankami iti
| Campo ti | ti | Naaddaankami | Kitaen dagiti ladawan. |
|---|---|---|---|
nwc_url | String iti | Wen | Naaddaankami iti link, begin. nostr+walletconnect://Ti Nymbot ket addaan iti wallet. get_info Ket, inton napudoten ti init, ti mana a nabati iti daga marunawen. |
threshold_sats | Napategda | Wen | Nagpatingga ti sumagmamano a nagpatingga iti nasurok a 1,000 a tawen. |
topup_sats | Napategda | Wen | Agtawenak laeng iti 1,000,000 a tawtawenak. |
tier | String iti | Ket | pro Kitaen dagiti ladawan. standard: ti balanse a makita ken ti top up. |
Reaksiona
{
"data": {
"connected": true,
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
"last_topup_at": null,
"last_topup_sats": null,
"last_error": null
}
}
| Status iti | ti |
|---|---|
400 | Maanadantayo dagiti kabaketan a pagsasaotayo (invalid_nwc_urlDaytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.nwc_unreachableMaanadantayo dagiti kabaketan a pagsasaotayo (nwc_rejectedMaanadantayo dagiti kabaketan a pagsasaotayo (nwc_missing_permission(Tuladenyo ti bagiyo tapno maammoanyo no pudno met laeng nga agbibiagkayo iti pammati.) |
501 | Ti maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua (nwc_unavailableIpapaupana ketdi ti kaaduan kadagitoy no kalgaw. |
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());
Kitaen dagiti ladawan.
GET https://nymbot.ai/api/v1/nwc-auto-topup Naaddaankami iti
Naaddaankami iti maysa a objekto, a connected: false Kitaen dagiti ladawan.
null Ngem saan a naaddaan ti sumagmamano a kabsat, saan a naaddaan ti kabsat.
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());
Disconnect iti
DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Naaddaankami iti
Naaddaankami iti maysa a kabsat, saan a naaddaankami iti maysa a kabsat.
Reaksiona
{ "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());
Ngem saan a pay laeng ti key.
Ti fixed-price endpoints ket mabalin a pagbayad iti maysa a request iti maysa a tiempo iti Lightning, saan a saan a key, saan a account ken saan a balanse: POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations ken POST /embeddingsTi chat, Responder, ken Messages ket mangted iti maysa a key. Ti request a mangted iti maysa a key ket nairuar iti saldo kas iti normal; ti pagbayad iti flow ket inusar idi awan ti key a nairuar.
Nymbot kuna ti dua a bersion ti maysa a idea, manipud iti maysa a backend: ti Lightning Labs.
Agtawenak idi 402. Kitaen dagiti ladawan. LSATAddaan iti IETF
Pagannurotan Ti HTTP authentication ket addaan iti lightning Nagpateg a
charge Apay a saan a saan a saan a saan a saan a saan a saan a saan a saan.
Ti pagbayad ket saan a nangikabil iti key. API_L402_SECRET Addaan iti 32 a byte, a hex (64 a karakter) wenno base64 (44). openssl rand -hex 32Ngem saan nga agturay ti agturay, agturay ti agturay iti agturay iti agturay. API_L402_SECRET_PREVIOUS Para iti maysa nga aldaw: kadagiti credentials, status URLs, ken dagiti challenge a nairekord iti dayta, agtrabaho agingga a maaddaan.
Addaan iti challenge
Agbiruk iti peticion no. Authorization Ngem saan a naaddaan ti inaramidna, saan a naaddaan ti 402 Payment Required iti in-facture para iti exact what that request costs: ti sama a price a key would pay, a konverted iti 10 sats a standard credit wenno 100 sats a Pro credit ken a raunded agingga iti intero a sat (minimo 1 sat, ken iti minimum a 0.05 credit minimum). WWW-Authenticate Addaan iti daytoy a problema:
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 }
}
Pagbayadda iti request Daytoy ket addaan iti base64url JSON.
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
Napateg ti problema iti endpoint, ti Content-Type (ti media a ti tipo ken, para iti multipart, ti limitasion) ken iti SHA-256 ti eksakto a body bytes ti inaramidna, ket mangidadael iti 15 a minuto. IDIOMA iti Inlawlawagna: Sama ti
Content-Type Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw./images/edits, /audio/transcriptions, /audio/translationsTi kaaduan a HTTP a libraria ket nalawag a limitasion a bagim iti ad-adu pay a coding a formulario.
Ti IPv6 address ket addaan iti 30 a challenge a minuto (ti IPv6 address ket addaan iti intero a /64). Dagiti requests a ti address ket saan a maaddaan iti 10 a minuto, ken adda ti total a cap kadagiti challenge a problema ti Nymbot iti amin a address; ti requests a refused before a challenge is made (p.e. a body that is not valid JSON) ket saan a maaddaan iti dayta. 429 ti Retry-AfterTi pagbayad a endpoints a nangipadala ket saan a key wenno credential ket kalpasanna agpatingga iti general limit ti 120 no authenticated requests a minute per address. Content-Type Daytoy ket application/json ( iti
multipart/form-data Isu ket pimmusay idiay asideg ti Edinburgh. 415 Kimmaro la ket ngarud ti an-annayenna.
Ti embeddings ket naipaay manipud kadagiti estimate ti tokens iti input, iti 1.5× margin, gapu ta ti real count ket maaddaan ngem. Nagpatingga ti token..
Addaan iti pagbayadda
Kasapulantayo ti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmat
| Schema iti | ti header |
|---|---|
| Agtawenak idi 402. | Authorization: L402 <macaroon>:<preimage> (LSAT Kitaen dagiti ladawan. |
| Pagannurotan | Authorization: Payment <base64url JSON>Addaan iti JSON. {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}} |
Ti pagbayad a request ket maaddaan iti maysa a key, agsipud ta ti nymbot
Ti objekto ket saan a balanse a fields: {"payment": "l402", "tier": "pro", "paid_sats": 237,
"charged_sats": 237}No isu ti X-Nymbot-Balance-Sats Nagpateg a pagbayad iti pagbayad iti sistema ti Pagbayad ket saan a Payment-Receipt Napateg ti header (base64url JSON with the challenge id, ti payments hash as reference, status ken
timestampTi pagbay-an ket saan a naaddaan iti daytoy a pammadayaw, ket saan a naaddaan iti historia ti pammadayaw.
| Status iti | ti |
|---|---|
402 payment_already_used | Kas iti pagbayad iti maysa a solicitation, ti reaksion ket maysa a challenge para iti daytoy a solicitation, kas ti maysa a client a cache ti maysa a credential (ti maysa a credential). lnget Naaddaankami idiay Malakanyang idiay Malakanyang. |
402 payment_mismatch | Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw. Content-Type Kas pagarigan, adda makaay-ayo iti pammati, wenno pay laeng ti inaramidna iti dayta a petición. Nagpatingga ti token. (refund_token ken refund_sats Addaan iti cuerpo. |
402 payment_expired | Agtawenak idi iti 15 a minuto manipud iti challenge. Napateg a challenge. No ti preimage naaddaan ti pagbayad, ti pagbayad ket naaddaan iti bagina. Nagpatingga ti token. (refund_token ken refund_sats Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw. |
401 invalid_preimage | Ti preimage ket awan ti hash iti pagbayad ti invoice. Ti pagbayad ket saan a nausar. |
401 invalid_payment_credential | Ti credential ket malformado, ti mabasa kalpasan ti inaramidna ti Nymbot, wenno ti nagan a pagbayad a hash ti Nymbot ket inaramidda ti inaramidda. |
429 rate_limit_exceeded | Ti nasurok a 30 a credentials wenno keys a nangaramid iti verification ket naidumduma manipud iti daytoy a address iti maysa a minuto, wenno ti maysa a refund token ket naidumduma iti agarup 60 a minuto. 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"));
Napateg dagiti customer iti mppx Napateg a pagbalinan ti pagbalinan iti pagbalinan; agpategda iti endpoint ken inaramidda ti pay.
Video ti
Pagbayadda iti POST /videos Respondona 202 Kas iti maysa, plus a
status_url: GET Naaddaankami iti maysa a trabaho, saan a naaddaankami iti maysa a trabaho, saan a naaddaankami iti maysa a trabaho.
{
"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..."
}
}
Pimmanaw ti refund_token Daytoy ket addaan iti kaaduan kadagitoy no kalgaw. (GET /api/v1/l402/refunds Respondona "status": "pending"Daytoy ket addaan iti kaaduan kadagitoy no kalgaw.
refund_sats Ti panagballigi ket addaan iti panagballigi ken panagballigi ket addaan iti panagballigi ken panagballigi.
Impanna iti
No awan ti pagbayad a request ket inlawlawag ti provider ti Nymbot para iti intento, ti pagbayadda ket inlawlawag ken ti error a nagsayaat, charged_satsIsu ket pimmusay idiay asideg ti Edinburgh, ken kadua met idi ti pamiliana. Nagpatingga ti token. Addaan iti pagbayad:
{
"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"
}
}
Daytoy ket addaan iti kaaduan kadagitoy no kalgaw.Isu ti kaaduan kadagitoy no kalgaw. nymbot Napateg a transcription ti naudi a lenguahe a saan a maaddaan iti ad-adu ti file ti naudi para iti naudi a lenguahe ti file ti naudi a naudi a 30 a minuto, ken ti diferensiada iti naudi a lenguahe ti naudi a naudi a token; no saan a naudi a naudi a 30 a minuto, ti naudi a naudi a naudi a naudi a 30 a minuto. 413
Daytoy ket addaan iti kaaduan kadagitoy no kalgaw.Idi linuktan ti kaaduan kadagitoy no kalgaw.
Ti backup token ket maysa a random 256-bit a code. Ti Nymbot ket mangisurat iti hash, ket agtawen iti 30 nga aldaw.
- Pay iti dayta. Kitaen dagiti ladawan.
Authorization: Bearer REFUND-…Nalawag ti kuna ti Biblia: “Asinoman a mangay-ayat iti kinaranggas pudno unay a guraen [ni Jehova].”refund_token_satsitinymbotNapateg a makisarita ti sumagmamano a sumagmamano a sumagmamano.402refund_insufficientDaytoy ket addaan iti kaaduan kadagitoy no kalgaw. - Napukawanna iti
GET /api/v1/l402/refundsNgem saan a nagpateg a nagpateg{"sats": 237, "status": "open", "expires_at": "..."}. - Ti maysa a token ket nausar iti 60 a minuto.
- Naaddaankami iti NIM. Napalalo iti Pimmanaw ti regalo Napateg ti app, iti call.
POST /api/v1/l402/refunds/redeemti a Agbiruk iti peticion. ken{"refund_token": "REFUND-...", "balance": "standard"}( iti"pro"Ti intero a kredito ket nalawag iti salun-at (10 sats iti standard, 100 iti Pro); sats a saan a maaddaan ti intero a kredito iti token para iti API request.
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"
Reaksiona
{ "data": { "credited": 23, "tier": "standard", "balance_credits": 123, "remaining_sats": 7 } }