Ny fototry ny fahalalana Ny mpandrindra
Balance, Top-ups sy ny fanalahidy
Jereo izay anananao, mihazakazaka amin'ny Lightning, mihazakazaka avy amin'ny volanao manokana, jereo ny vidin'ny fangatahana tsirairay, ary mitantana ny fanalahidy avy amin'ny code.
Ity pejy ity dia nadika amin'ny milina mba hahamora kokoa. Ny original amin'ny teny anglisy no dikan-teny mihatra.
Tsidiho ny fitoviana
Ireo roa ireo dia ny tahirin-kevitrao, ary ny habetsahan'ny kapila amin'ity fanalahidy ity dia ampiasaina.
GET https://nymbot.ai/api/v1/credits/balance Mila ny fanalahidy API ianao. POST Miasa ihany koa, ho an'ny mpanjifa izay manantena izany.
balance Ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidiny (null Raha tsy afaka mamaky ny vidiny). Ny sisa dia ao amin'ny credits sy sats, izay no fomba fitehirizana ny salan'ny tena. key Manoratra ny fanalahidy izay nangataka. Ny fanalahidy izay efa nahatratra ny kapila dia mbola afaka manamarina ny salan-tsakafo.
Ny valiny
{
"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"
}
}
| Ny toerany | Rehefa |
|---|---|
401 | Ny fanalahidy dia tsy hita, tsy fantatra, voamarina na tapitra. |
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);
Ny fomba fandoavam-bola
Ahoana no ahafahanao miakatra, ary ny fetra. Lightning no fomba tokana.
GET https://nymbot.ai/api/v1/topup/payment-methods Tsy ilaina ny fanalahidy.
Ny top-up dia 10 ka hatramin'ny 1.000.000 sats; ny Pro-top-up dia tsy maintsy mividy kely indrindra ny iray Pro credit, noho izany dia manomboka amin'ny 100 sats. bulk_bonus Ity lisitra ity dia mamaritra ny karama fanampiny amin'ny top-ups lehibe kokoa, mitovy amin'ny ao amin'ny fampiharana: 10%, 15% na 20% mihoatra amin'ny standard top-ups avy amin'ny 500, 1,000 na 5,000 sats, ary amin'ny Pro top-ups avy amin'ny 5,000, 10,000 na 50,000 sats.
Ny valiny
{
"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);
Miakatra eo ambonin'ny Lightning
Manangana karatra Lightning izay manampy ny karatra amin'ny nym izay ananan'ny fanalahidy. Mandoa izany avy amin'ny karatra Lightning, dia Jereo izany Mba hahazoana ny trosa fanampiny.
POST https://nymbot.ai/api/v1/topup/create/btc-lightning Mila ny fanalahidy API ianao.
| Ny sehatra | Ny karazana | Tsy maintsy | Ny famaritana |
|---|---|---|---|
amount | Ny isa | ENY | Ary ny habetsaky ny, ao currencyNy isa iray manontolo ho an'ny vidiny. |
currency | Ny String | Tsy | SATS Ny tsy fahampian'ny USD Ary BTCNy dolara dia miova amin'ny vidin'ny Bitcoin ankehitriny. |
tier | Ny String | Tsy | pro (Ny tsy fahampian-tsakafo) na standard: amin'ny taham-pahamehana ny fampindramam-bola. |
Ny fampindramam-bola ankapobeny dia 10 sats sy ny Pro fampindramam-bola 100 sats, plus na inona na inona tombony;
credits Manambara ny zavatra hanampy amin'ity kaonty ity.
Ny valiny
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"payment_request": "lnbc100u1p5...",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": "2026-09-30T09:27:00Z",
"status": "pending"
}
| Ny toerany | Rehefa |
|---|---|
400 | Ny fomba hafa amin'ny lalana (unsupported_method, ny vola tsy fantatra (unsupported_currency(Na dia tsy ampy aza ny fandoavam-bola, na tsy ampy aza ny fandoavam-bola)amount_too_smallAmin'ny ankapobeny, mihoatra ny 1 tapitrisa (amount_too_large) na tsy nahazo alalana avy amin'ny Lightning Wallet (amount_out_of_range). |
429 | Mihoatra ny 60 faktiora ho an'ity nym ity, na 120 avy amin'ity adiresy ity, ao anatin'ny ora iray (rate_limit_exceededAo amin'ny Retry-After). |
502 | Tsy azo atao amin'izao fotoana izao ny fanamarinana (invoice_unavailableAo amin'ny 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);
Tsidiho ny top-up
Manontany raha efa nandoa ny faktiora ary, rehefa manana, dia manampy ny karama. Ny fanamarinana dia ny karama, ka aorian'ny fandoavam-bola, jereo mandra-pahatongan'ny toe-javatra creditedNy fanaraha-maso indray dia azo antoka: ny trosa dia tonga indray mandeha, na inona na inona indray mandeha ianao.
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - mila fanalahidy avy amin'ny nym izay nanao ny faktiora.
status Ny pending (Ary mbola tsy voavonjy ny vola) paid (mandoa vola, fa mbola tsy voavidy; jereo indray), credited (na amin'ny tahirin-kevitrao) na expired [Na: Fa inona no fanantenan'ny mpihatsaravelatsihy, na dia mahazo harena aza.
Ny valiny
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| Ny toerany | Rehefa |
|---|---|
400 | Ny ID dia tsy ny 64-marika ID avy amin'ny famoronana antso. |
404 | Tsy misy fangatahana avy amin'io ID io ho an'ny 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);
Tian'ny tantara
Ny andininy iray isaky ny fangatahana: inona no izy, inona ny modely, firy token, ary inona ny vidiny. Tsy misy fangatahana na valiny voatahiry, ka tsy misy miverina. Ny andininy dia voatahiry mandritra ny 90 andro, vaovao indrindra voalohany. Ny fanalahidy izay efa nahatratra ny kapila dia mbola afaka mamaky ny tantara.
GET https://nymbot.ai/api/v1/queries/history - mila API fanalahidy, izay mahita ny fangatahany manokana, na Nanoratra ny fangatahana avy amin'ny nym, izay mahita ny fanalahidin'ny tsirairay.
| Ny sehatra | Ny karazana | Tsy maintsy | Ny famaritana |
|---|---|---|---|
page | Ny fanontaniana dia | Tsy | Default 1, amin'ny ankamaroan'ny 1000; ny pejy ambony dia 400 invalid_value. |
page_count | Ny fanontaniana dia | Tsy | Rays per page. Default 20, amin'ny ankamaroan'ny 100. |
start_dateend_date | Ny fanontaniana dia | Tsy | ISO 8601 daty na fotoana. |
model | Ny fanontaniana dia | Tsy | Ny modely ihany. |
type | Ny fanontaniana dia | Tsy | chat, responses, messages, image, video, speech, transcription Ary embedding. |
all_keys | Ny fomba fanao (query) | Tsy | Ny fanalahidy iray: true ahitana ny tsirairay amin'ny nym. Default false. |
key_id | Ny fanontaniana dia | Tsy | Amin'ny fangatahana voasoratra anarana, na amin'ny all_keys=trueTsy misy afa-tsy ity fanalahidy ity. |
Ny valiny
{
"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);
Manaiky ny fangatahan'ny kaonty
Ny famoronana, ny fanovana sy ny fanafoanana ny fanalahidy, ny famaranana ny kaonty sy ny fanapahan-kevitra automatique dia tsy mandray ny fanalahidin'ny API. Izy ireo dia mandray ny fanamarihana avy amin'ny nym, ka ny fanalahidin'ny fanalahidin'ny kaonty dia afaka mandany hatramin'ny fahafahany, fa tsy afaka manao fanalahidin'ny fanalahidin'ny kaonty hafa na hampitombo ny fahafahany.
Ny fampiharana dia manao izany ho anao: ny zava-drehetra ao amin'ny Ny afo Ny pejy dia mampiasa ireo endpoints. Tsy ilainao afa-tsy ity fizarana ity mba hanara-maso ny fanalahidy avy amin'ny code anao manokana.
Ny fanamarihana dia zava-nitranga Nostr amin'ny karazana 27235 (NIP-98), nalefa amin'ny base64
Authorization Header miaraka amin'ny teny Nostr Ary eo anoloan'ny
Ny zava-nitranga
{
"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": "..."
}
udia ny URL feno amin'ny fangatahana, anisan'izany ny fanontaniana, toy ny nalefa.methodNy fomba HTTP.payloaddia ny SHA-256 amin'ny vatana fangatahana voajanahary, amin'ny hex.POSTSYPATCHary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota ; ary Obeda an'i Jese ;created_atTokony ho ao anatin'ny 60 segondra avy amin'ny mpizara ny fotoana.- Ny zava-drehetra dia miasa indray mandeha, a
GETvoasoratra ao amin'ny fangatahana, ka tsy afaka mamerina indray ny lohateny voasoratra. Manoratra iray vaovao ho an'ny fangatahana tsirairay.nonceny marika miaraka amin'ny isa tsy ara-drariny mba hisorohana fangatahana roa voasoratra ao anatin'ny segondra iray ihany mbola tsy mitovy. - Ny vatana voasoratra ao amin'ny fangatahana dia mety ho 64 KB, ary ny vatana dia mila
Content-Type: application/json.
Miverena ny zava-nitranga tsy hita 401 missing_nostr_authiray izay tsy tsara noforonina, ratsy voasoratra, tranainy loatra, na ho an'ny URL hafa, fomba na vatana dia miverina
invalid_nostr_authary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota .
nostr_auth_replayedNy fanamarihana dia voamarina alohan'ny hamaky ny vatana, ary ny adiresy tsirairay dia mety tsy mahavita azy 30 fotoana isaky ny minitra (ny adiresy IPv6 dia mifanaraka amin'ny /64); Aorian'izany dia mahazo 429 Ny
Retry-After.
Ny navigateur dia afaka miantso ireo endpoints avy amin'ny tranokalan'i Nymbot fotsiny (https://nymbot.ai,
https://nymchat.app ary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota ; ary Obeda niteraka an'i Jese ;
OriginTsy misy fiantraikany.
Ny fanamarihana dia mila ny fanalahidin'ny nym anao (ny nsec), izay manara-maso ny zava-drehetra: ny mombamomba anao, ny tantara sy ny tahirin-kevitrao. Aoka ho voasoratra ao amin'ny script ao amin'ny milina izay matoky anao, mamaky azy avy amin'ny tontolo iainana fa tsy manoratra azy ao amin'ny rakitra, ary misafidy ny fampiharana rehefa afaka.
Ireo mpanampy ireo dia mamorona ny lohateny. Ny ohatra farany eto amin'ity pejy ity dia mampiasa azy ireo. Manoratra ny fanalahidy malalaka amin'ny hex avy amin'ny NOSTR_SECRET_HEXNy CURL iray dia mampiasa ny
Ny fitaovana, izay mandray ny nsec na hex key, ary sha256sum Ao amin'ny 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");
}
Ny famaritana ny kaonty
Inona no hita ao amin'ny lisitry ny API ao amin'ny fampiharana: ny fanalahidy an-tserasera, ny fahasamihafana, ny isan'ny fanalahidy mavitrika (tsy voamarina na tsy tapitra), ary ny Automatika ny top-up Ny fametrahana, na
null raha tsy manolotra azy ireo ny mpizara.
GET https://nymbot.ai/api/v1/account Mila ny Nanoratra ny fangatahana.
Ny valiny
{
"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());
Ny fitantanana ny fanalahidy
Ny endpoints ao ambadiky ny lisitry ny fanalahidin'ny fampiharana. Ny rehetra dia mila Nanoratra ny fangatahanaNy tsirairay dia miverina amin'ity endrika ity, miaraka amin'ny fotoana ao amin'ny ISO 8601 sy ny habetsaky ny sats:
Ny lohahevitra
{
"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 Izany dia ampy mba hahafantarana ny fanalahidy fa tsy hampiasa azy. Ny fanalahidy ihany no miverina indray mandeha, rehefa natao.
Ny fanalahidy
GET https://nymbot.ai/api/v1/keys Nandray ny fanambarana.
| Ny sehatra | Ny karazana | Tsy maintsy | Ny famaritana |
|---|---|---|---|
include_revoked | Ny fomba fanao (query) | Tsy | Ampifanaraka amin'ny fanamafisana ny fanamafisana. Default false. |
Ny valiny
{ "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);
Ny fananganana ny fanalahidy
POST https://nymbot.ai/api/v1/keys Miverena amin'ny 201.
| Ny sehatra | Ny karazana | Tsy maintsy | Ny famaritana |
|---|---|---|---|
name | Ny String | ENY | 1 ka hatramin'ny 40 marika, tsy mitovy amin'ny fanalahidy hafa mavitrika (tsy manadino ny tranga). |
limit_sats | Tsy miankina | Tsy | Ny fandoavam-bola cap amin'ny sats, fara fahakeliny 1. |
reset_period | Ny String | Tsy | daily, weekly Ary monthlyMila ny limit_satsAvelao izany ho an'ny kapoaka izay tsy miverina intsony. |
expire_at | String na ny integer. | Tsy | Rehefa tsy miasa ny fanalahidy: ISO 8601 fotoana, na milliseconds hatramin'ny 1970. |
Ny valiny (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"
}
}
| Ny toerany | Rehefa |
|---|---|
400 | Ny anarana tsy misy na lava loatra; anarana efa ampiasaina (duplicate_name); cap izay tsy isan'andro farafaharatsiny 1; fe-potoana famerenana tsy misy cap; vanim-potoana tapakila amin'ny lasa; sehatra tsy fantatra (unknown_parameter); na 25 ny fanalahidy miasa efa (too_many_keys). |
429 | Mihoatra ny 60 fanalahidy vita amin'ity nym ity, na 120 avy amin'ity adiresy ity, ao anatin'ny ora iray (rate_limit_exceededAo amin'ny 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);
Vakio ny fanalahidy iray
GET https://nymbot.ai/api/v1/keys/{id} Nandray ny fanambarana.
Miverena {"data": {…}} miaraka amin'ny lohahevitra fototra, na 404
key_not_found Raha tsy misy ny anaran'ny anao dia manana izany 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);
Miova ny fanalahidy
PATCH https://nymbot.ai/api/v1/keys/{id} Nandray ny fanambarana.
Handefa ny iray amin'ireo name, limit_sats, reset_period SY
expire_at, amin'ny fitsipika mitovy amin'ny amin'ny fametrahana fanalahidy. null Tsy misy fanitsiana, tsy misy famerenana, tsy misy famaranana. Ny fanitsiana ny vanim-potoana dia manomboka ny vanim-potoana vaovao amin'ny zero. Ny fanitsiana dia tsy azo ampiharina (400 key_revokedMiverena ny
{"data": {…}} miaraka amin'ny fitaovana manan-danja vaovao.
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);
Ny fanesorana ny fanalahidy
DELETE https://nymbot.ai/api/v1/keys/{id} Nandray ny fanambarana.
Manakana ny fanalahidy avy hatrany, ho an'ny tsara. Mijanona ao amin'ny lisitry ny revoked_at voasoratra, ary azo jerena amin'ny include_revoked=trueNy famerenana ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin
Ny valiny
{ "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());
Ao amin'ny NWC Auto-top-up
Mifandray amin'ny Lightning Wallet miaraka amin'ny Nostr Wallet Connect ary ny Nymbot dia manatsara ny salan-tsakafo amin'ny tenany rehefa mampiasa ny API dia mihazakazaka. Ny rakitra API amin'ny fampiharana dia manana fepetra mitovy; ireo dia ny endpoints manaraka azy. Nanoratra ny fangatahana.
Ahoana no miasa: Aorian'ny fangatahana API dia voavidy ho amin'ny salan-tsakafo izay nifidy mba hijery, raha ny salan-tsakafo dia nidina ambany ny fe-potoan'ny, ny Nymbot dia mametraka faktiora ho an'ny habetsaky ny vola, mangataka ny volan-dalamby mba handoa azy, ary manampy ny fampindramam-bola. Izany dia miakatra hatramin'ny indray mandeha isaky ny 5 minitra ho an'ny nym sy ny salan-dalamby, noho izany dia tsy afaka mamono ny volan-dalamby ny fangatahana. Ny fandaniana ao amin'ny fampiharana dia tsy miteraka izany. Ny fotoana sy ny habetsaky ny farany, ary ny fahadisoana farany, dia ao amin'ny safidy; Ny top-up dia Mino izany ny
Ny Nymbot dia mitahiry izany amin'ny alàlan'ny fandoavam-bola ary mampiasa azy fotsiny amin'ny fandoavam-bola ho an'ny faktiorony manokana, fa manao fifandraisana fotsiny ho an'izany, miaraka amin'ny fandoavam-bola ao amin'ny fonosanao, ka ny ankamaroan'ny afaka mandoa dia ny isan'ny nifidy anao. pay_invoice.
Mifandray amin'ny Wallet
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Nandray ny fanambarana.
| Ny sehatra | Ny karazana | Tsy maintsy | Ny famaritana |
|---|---|---|---|
nwc_url | Ny String | ENY | Ny fifandraisana, manomboka amin'ny nostr+walletconnect://Ny Nymbot dia mitaky ny Wallet ho an'ny get_info alohan'ny hamonjena azy, ary mitahiry izany voasoratra anarana. |
threshold_sats | Tsy miankina | ENY | Miakatra eo amin'ny ambaratonga ambony rehefa mihena ambany amin'io vidin-javatra maro io. farafaharatsiny 1000. |
topup_sats | Tsy miankina | ENY | Ohatrinona no hanampy isaky ny fotoana. 1000 ka hatramin'ny 1.000.000 sats. |
tier | Ny String | Tsy | pro (Ny tsy fahampian-tsakafo) na standard: ny fitoviana mba hijery sy ny ambony. |
Ny valiny
{
"data": {
"connected": true,
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
"last_topup_at": null,
"last_topup_sats": null,
"last_error": null
}
}
| Ny toerany | Rehefa |
|---|---|
400 | Tsy misy fifandraisana (invalid_nwc_url[Na: Fa inona no fanantenan'ny mpihatsaravelatsihy, na dia mahazo harena be aza.nwc_unreachable) na tsy nanaiky ny fanaraha-maso (nwc_rejected); ny fifandraisana dia tsy afaka mandoa faktiora (nwc_missing_permission); na vola ivelan'ny fetra. |
501 | Tsy voaaro ho an'ity serivisy ity ny fametrahana automatic top-ups (nwc_unavailableToy izany ihany koa amin'ny farany roa hafa. |
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());
Vakio ny safidy
GET https://nymbot.ai/api/v1/nwc-auto-topup Nandray ny fanambarana.
Miverena ny zavatra mitovy amin'ny mifandray, amin'ny connected: false Ary ny sehatra hafa
null Rehefa tsy misy saram-pifandraisana mifandray, dia tsy hiverina mihitsy ny famantarana ny fifandraisana.
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());
Ny fifandraisana
DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Nandray ny fanambarana.
Hamafa ny fifandraisana voatahiry. Tsy misy fanapahan-kevitra intsony. Mba ho azo antoka, azonao atao ihany koa ny manafoana ny fifandraisana ao amin'ny wallet.
Ny valiny
{ "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());
Mandoa vola amin'ny fangatahana tsy misy fanalahidy
Ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin-javatra: POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations SY POST /embeddingsNy fangatahana izay mitondra ny fanalahidy dia ampidirina amin'ny tahiry toy ny mahazatra; ny fandefasana fandoavam-bola dia manomboka raha tsy misy fanalahidy alefa.
Ny Nymbot dia miteny dikan-teny roa amin'ny hevitra mitovy, avy amin'ny backend iray: Lightning Labs'
Ny 402 (Misy ihany koa ny anaran'ny reniny taloha, LSAT) ary ny tetikasa IETF
Ny karama Ny rafitra fanamarinana HTTP miaraka amin'ny lightning Ny fomba sy
charge Mampiasa izay mahatakatra ny mpanjifanao.
Ny fandoavam-bola tsy misy fanalahidy dia amin'ny fotoana API_L402_SECRET mitana farafaharatsiny 32 bytes, toy ny hex (64 marika) na base64 (44). openssl rand -hex 32Ny isa fohy kokoa na azo antoka dia manakana ny endri-javatra ary manoratra ny antony. API_L402_SECRET_PREVIOUS ho an'ny andro iray: ny fahazoan-dalana, ny tranonkala URL sy ny fanamby nataony eo ambany dia mbola miasa mandra-pahatongan'izy ireo.
Ny fanamby
Mandefa ny fangatahana miaraka amin'ny tsy Authorization Header. Raha manan-kery izany, tsy misy zavatra mihazakazaka, ary mahazo 402 Payment Required miaraka amin'ny faktiora ho an'ny marina izay fangatahana vidiny: ny vidiny mitovy amin'ny fanalahidy dia handoa, niova amin'ny 10 Sats ny fitokisana ara-dalàna na 100 Sats ny Pro fitokisana ary manodidina hatramin'ny iray manontolo Sats (amin'ny farafaharatsiny 1 Sats, ary farafaharatsiny ny 0.05 credit minimum). WWW-Authenticate Fanamby ho an'ny kaonty mitovy:
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 }
}
Ny fandoavam-bola request Ny endrika dia base64url JSON:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
Ny fanamby dia mifandray amin'ny farany, amin'ny Content-Type (ny karazana haino aman-jery sy, ho an'ny ampahany maro, ny sisiny) ary ny SHA-256 ny vatana marina bytes ianao naniraka, ary maharitra 15 minitra. Ny mitovy Ny fangatahana indray: mitovy
Content-Type ary ny JSON bytes mitovy, na ho an'ny endpoints maro (/images/edits, /audio/transcriptions, /audio/translationsNy ankamaroan'ny tranonkala HTTP dia misafidy fetra vaovao isaky ny mandrakotra endrika, noho izany dia mandrakotra azy indray mandeha ary mandefa ireo bytes roa.
Ny adiresy tsirairay dia afaka mangataka fanamby 30 isaky ny minitra (ny adiresy IPv6 dia mifanaraka amin'ny /64). Ny fangatahana izay adiresy tsy fantatra dia mizara 10 isaky ny minitra, ary misy fetra manontolo amin'ny fanamby ny olana Nymbot amin'ny adiresy rehetra; ny fangatahana voadika alohan'ny fanamby (ohatra amin'ny vatana izay tsy manan-kery JSON) dia tsy mifanaraka amin'izany. 429 Ny Retry-After, nalefa alohan'ny famakiana ny vatana. Ny endpoints voavonjy antsoina tsy misy fototra na fahazoan-dalana koa dia mifantoka amin'ny fetran'ny ankapobeny 120 fangatahana tsy voamarina isaky ny minitra. Ny fahazoan-dalana dia voamarina alohan'ny famakiana ny vatana, ary ny fangatahana izay Content-Type Tsy application/json Na ny
multipart/form-data Na izany aza, ny fanesorana dia tsy voatery 415 Tsy mahazo faktiora mihitsy aho.
Ny fidirana dia mifototra amin'ny vidin'ny token ao amin'ny fidirana, miaraka amin'ny marika 1.5; fotoana, satria ny isan'ny tena dia fantatra fotsiny aorian'izay. Miverina amin'ny token.
Handefa ny fandoavam-bola
Mandoa ny faktiora amin'ny Wallet Lightning. Ny Wallet dia manome anao ny preimage, 64 hex characters. Avy eo mandefa ny fangatahana mitovy amin'ny iray amin'ireto:
| Ny rafitra | Ny header |
|---|---|
| Ny 402 | Authorization: L402 <macaroon>:<preimage> (LSAT Izy koa dia miasa) |
| Ny karama | Authorization: Payment <base64url JSON>Raha misy ny JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}} |
Ny fangatahana voavaly dia mifanaraka amin'ny fangatahana atao amin'ny fanalahidy, afa-tsy ny nymbot
Ny fitaovana dia tsy manana sehatra fitoviana: {"payment": "l402", "tier": "pro", "paid_sats": 237,
"charged_sats": 237}Ary tsy misy ny X-Nymbot-Balance-Sats header. Ny fangatahana nomena amin'ny rafitra fandoavam-bola koa dia mahazo Payment-Receipt header (base64url JSON miaraka amin'ny fanamby id, ny fandoavam-bola hash toy reference, status SY
timestampNy fangatahana nomena dia tsy mifandray amin'ny nym, noho izany dia tsy hita ao amin'ny tantara fanontaniana.
| Ny toerany | Rehefa |
|---|---|
402 payment_already_used | Ny valiny dia fanamby vaovao ho an'ity fangatahana ity, noho izany, ny mpanjifa izay mihazakazaka ny fampahafantarana farany (toy ny lnget Ary indray ny tany ihany no miverina. |
402 payment_mismatch | Ny fampahafantarana dia navoaka ho an'ny toerana iray hafa, Content-Type na vatana, na mandoa latsaky ny vidin'io fangatahana io ankehitriny. Ny fanamby vaovao ho an'ity fangatahana ity dia tonga miaraka aminy; raha kely loatra ny fandoavam-bola, dia miverina ho toy ny Miverina amin'ny token (refund_token SY refund_sats Ao amin'ny vatana |
402 payment_expired | Mihoatra ny 15 minitra lasa izay nanomboka tamin'ny fanamby. Ny fanamby vaovao dia tonga miaraka aminy. Raha mampiseho ny sary an-tsary fa efa nandray vola ianao, dia miverina ho toy ny fanamby. Miverina amin'ny token (refund_token SY refund_sats Ao anaty fitafiana vita amin'ny lamba. |
401 invalid_preimage | Ny preimage dia tsy mampifandray amin'ny fandoavam-bola hash amin'ny faktiora. Ny fandoavam-bola dia tsy ampiasaina. |
401 invalid_payment_credential | Ny fampahafantarana dia diso, niova taorian'ny nanambara ny Nymbot, na ny anaran'ny fandoavam-bola hash Nymbot tsy nanambara ny faktiora. |
429 rate_limit_exceeded | Mihoatra ny 30 ny fampahafantarana na ny fanalahidy izay tsy nahavita tonga avy amin'ity adiresy ity ao anatin'ny minitra iray, na token fandoavam-bola iray dia nalefa mihoatra ny 60 fotoana ao anatin'ny minitra. 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"));
Ny mpanjifa dia naorina mppx amin'ny fomba Lightning manatanteraka ny fangatahana fandoavam-bola ny tenany; manondro azy ireo amin'ny farany ary aoka izy ireo handoa.
Ny lahatsary
Ny karama POST /videos Ny valiny 202 Tahaka ny tsindry iray, plus a
status_url: GET Izany dia voasoratra ary miasa mandritra ny 24 ora, raha mbola voatahiry ny asa.
{
"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..."
}
}
Aoka ny refund_token amin'ny alalan'ny fanehoan-kevitra avy amin'ity valin-teny ity: dia aseho fotsiny eto. Ny lahatsary dia mivoaka (GET /api/v1/l402/refunds Ny valiny "status": "pending"); raha tsy nahavita ny fandefasana, ny fandoavam-bola dia miakatra eo amin'izany.
refund_sats ho an'ny asa nandoa vola, fa tsy ny token, noho izany ny fandefasana ny URL dia tsy mizara ny fandoavam-bola.
Ny famerenana
Raha tsy nahavita ny fangatahan'ny fandoavam-bola ary ny mpamatsy dia nahazo ny Nymbot noho ny ezaka, ny fandoavam-bola dia voatahiry ary ny fahadisoana dia milaza izany, amin'ny charged_sats, toy ny amin'ny fangatahana voasoratra anarana. Raha tsy mitranga raha tsy voasoratra, ny fahadisoana dia mitondra Miverina amin'ny token Izany dia mendrika ny vola nomenao:
{
"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"
}
}
Ny ampahany tsy ampiasaina dia miverina amin'ny fomba mitovy: raha nangataka sary roa ianao ary tsy nahavita ny iray, ny valin'ny fahombiazana nymbot dia mitondra token famerenana ho an'ny tsy misy; transkription izay tsy afaka mamaky ny fe-potoana mialoha no vidin'ny ho ela indrindra ny rakitra mety ho (tsy mihoatra ny 30 minitra), ary ny fahasamihafana amin'ny fe-potoana tena dia miverina ho token famerenana; raha toa ka mihoatra noho ny 30 minitra, dia tsy azo alaina amin'ny 413
ary ny fandoavam-bola manontolo dia miverina. Ny fidirana dia miverina amin'ny zavatra voatahiry. Ny lahatsary tsy nahavita dia miverina amin'ny token niverina.
Ny token fandoavam-bola dia token 256-bit. Ny Nymbot dia mitahiry ny hash ihany, ary mifarana aorian'ny andro 30. Ny token dia mitahiry ny salan'ny sat, ary azonao atao ny:
- Mandoa vola amin'izany Manolotra
Authorization: Bearer REFUND-…ary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota ; ary Obeda niteraka an'i Jese ;refund_token_satsAo amin'nynymbotToken kely kokoa noho ny valin'ny fangatahana402refund_insufficientNy tsy fahombiazana dia mametraka ny sats indray amin'ny token mitovy. - Jereo izany ny
GET /api/v1/l402/refundsmiaraka amin'ny header mitovy dia miverina{"sats": 237, "status": "open", "expires_at": "..."}. - Ny token iray dia azo ampiasaina hatramin'ny 60 fotoana isaky ny minitra.
- Ataovy eo amin'ny nym izany. Ataovy ao amin'ny Ampiasao ny fanomezana ao amin'ny app Nymbot, na antso
POST /api/v1/l402/refunds/redeemNy a Nanoratra ny fangatahana SY{"refund_token": "REFUND-...", "balance": "standard"}Na ny"pro"Ny valiny manontolo dia mandeha amin'ny salan'ny (10 valin'ny tsirairay amin'ny Standard, 100 amin'ny Pro); valin'ny izay tsy mahatonga ny valin'ny token manontolo ho an'ny fangatahana 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"
Ny valiny
{ "data": { "credited": 23, "tier": "standard", "balance_credits": 123, "remaining_sats": 7 } }