Bingeha zanînê Dizayner/Pêşveber
Bakiye, zêdekirin û mifte
Check bike çi heye, bi Lightning re zêde bike, ji hewşiya xwe re bi avtomatîkî zêde bike, bibîne ku her daxwaz bi çi metel e, û ji koda xwe ve klîdan birêve bibe.
Ev rûpel ji bo rehetiyê bi makîneyê hatiye wergerandin. Orjînala Îngilîzî guhertoya ku derbas dibe ye.
Kontrola bakiye
Her du bilansekên te, û çendê ji plafoya vê kefê hatiye bikaranîn.
GET https://nymbot.ai/api/v1/credits/balance — pêdivî bi API keyekî heye. POST Ji bo mişteriyan yên ku hêvî dike, dixebite jî.
balance ma du hejmarên bejayê bi tevahî bi dolaran ne li gorî bihayê Bitcoinê yê niha, ji bo
amûran ku tenê yek hejmar dixwazin (null eger bihay neyê xwendin). Beşê din di kredit û sats de ye, ku ew e ku hejmarên bejayê bi rastî têne parastin. key sînorê kuncê ku hatibû daxwazkirin dinivîse. Kuncê ku gihastiye sînorê xwe dikare hîn jî bilansekê bipirse.
Bersiv
{
"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"
}
}
| Rewşa | Kengî |
|---|---|
401 | Kunc winda ye, nayê naskirin, hatî betalkirin an jî derbas bûye. |
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);
Metodên dravdanê
Tu çawa dikarî zêde bikî, û sînor çi ne. Lightning tenê rêbaz e.
GET https://nymbot.ai/api/v1/topup/payment-methods — tu nekarî nebelîje.
Zêdekirin (top-up) ji 10 heta 1,000,000 sats e; zêdekirina Pro divê herî kêm yek krediyê Pro bikire, loma ew li 100 sats dest pê dike. Sînorên dolarê li gorî dîlbahaşiya Bitcoinê ne. bulk_bonus Krediyê zêde li ser zêdekirinên mezinan diçerxesîne, wekî di appê de ye: 10%, 15% an 20% zêdetir li ser zêdekirinên standard ên ji 500, 1,000 an 5,000 satsan, û li ser zêdekirinên Pro yên ji 5,000, 10,000 an 50,000 satsan.
Bersiv
{
"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);
Li ser Lightning zêdekirin (Topping up)
Faturayeke Lightning çêdike ku biçîk bike da ku kredî lê zêde bibe.
POST https://nymbot.ai/api/v1/topup/create/btc-lightning — pêdivî bi API keyekî heye.
| Zevî | Tîp | Pêwîst e | Wate |
|---|---|---|---|
amount | hejmar | Erê | Çend, di... de currencyJi bo sats, hejmareke tam. |
currency | tîrêj | Na | SATS (yê default,) USD an BTCDollar bi bihayê Bitcoinê yê niha tê veguherandin. |
tier | tîrêj | Na | pro (yê default) an jî standard: kîjan hejmar (balance) kredî tê de diçe. |
Krediyeke standard 10 sats e û krediyeke Pro 100 sats e, ligel her bonusa komî;
credits dibêje ev fîtur (invoice) çi dê lê zêde bike.
Bersiv
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"payment_request": "lnbc100u1p5...",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": "2026-09-30T09:27:00Z",
"status": "pending"
}
| Rewşa | Kengî |
|---|---|
400 | Metodeke din di rêyê de (unsupported_method), pêveke neyarî (unsupported_currency) an jî qat, mîqarek bê, an jî mîqareke di bin asta herî kêm de (amount_too_small), li jor 1,000,000 sats (amount_too_large) an jî ji hêla waleta Lightning ve hat redkirin (amount_out_of_range). |
429 | Zêdetirî 60 faturayên ji bo vê nymê, an jî 120 ji vê navnîşanê, di saetekî de (rate_limit_exceeded, bi Retry-After). |
502 | Niha faturayek çêkirin nabe (invoice_unavailable, bi 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);
Kontrolkirina zêdekirina (top-up) dewlemendiyê
Dipirse ka faturay hatiye danasîn û, gava ku hat, krediyê lê zêde dike. Kontrolkirin e ku
krediyê dide wê, lewso piştî danînê, kontrol bike heta ku rewş weha bibe creditedPiştî wê, careke din kontrol kirin ewle ye: kredî carekê dikeve nav hesab, çi kadar tu bipirsî.
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — ji nymê ku fakturê çêkiriye pêdivî bi mifteyekê heye.
status ye pending (Hîn nehatiye perdan,) paid (têpayandin hatiye kirin, lê hîn nehatîye nivîsandin; careke din kontrol bike), credited (li ser hejmara te) an jî expired (ne di wextê de hatîye dan). Qadên hejmarê ji bo asta ku fakturê tije dike ne.
Bersiv
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| Rewşa | Kengî |
|---|---|
400 | ID, ID'a 64-karakterî ya ji call'a çêkirinê nîne. |
404 | Bi wê ID'ê ji bo navê te ne faturayek heye (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);
Dîroka pirsên (query)
Her rêzek ji bo daxwazekê: çi bû, kîjan model bû, çend token bûn û çiqas bi qîmet bû. Tu prompt an jî bersiv nayên parastin, lewma tu yek nayên vegerandin. Rêz ji bo 90 rojan têne parastin, nûtrîn li ser herî serê. Pergeyeke ku gihastiye sînorê xwe, dikare dîroka xwe bixwîne.
GET https://nymbot.ai/api/v1/queries/history — pêdivî bi koda API heye, ku daxwazên xwe dibîne, an jî a daxwaza îmzekirî ji navê te yê nîşanî, yê ku her perçeyî dibîne.
| Zevî | Tîp | Pêwîst e | Wate |
|---|---|---|---|
page | yekîna tam (pirs) | Na | Default 1, herî kêm 1,000; rûpeleke bilindtir ev e 400 invalid_value. |
page_count | yekîna tam (pirs) | Na | Rêz per rûpelê. Default 20, herî zêde 100. |
start_dateend_date | tîp (pirsiyar) | Na | Dîrok an demên ISO 8601. |
model | tîp (pirsiyar) | Na | Tenê ev model. |
type | tîp (pirsiyar) | Na | chat, responses, messages, image, video, speech, transcription an embedding. |
all_keys | boolean (pirsiyar) | Na | Bi kileçekî: true hemû kîleyên bi heman navê (nym) digireve. Default false. |
key_id | tîp (pirsiyar) | Na | Bi daxwazeke îmzekirî, an jî bi all_keys=trueTenê vê mifteyê. |
Bersiv
{
"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);
Daxwazên îmzekirina hesabî
Çêkirin, guhertin û betalkirina kuncan, kurteya hesabî û zêdekirina otomatîk a bejayan kuncê API naxwazin. Ew îmzeyekê ji nymê we werdigirin, ji ber vê yekê kunceke ku derketî dikare heta sînorê xwe xeman bike, lê qet nikare kuncek din çêbike an sînorê xwe bilind bike.
App ji bo te vê dike: her tişt di xwe de... API pergal van endpointan bi kar tîne. Tenê wextê ku tu dixwazî ji koda xwe ve kuncikan birêve bî, tu tenê vê beşê hewceyî yî.
Navnîşana (signature) bûyekî Nostr ê ji curem 27235 (NIP-98) ye, ku bi şêwazê base64-encoded tê şandin di
Authorization Serî bi peyvê Nostr li pêş:
Çalakî
{
"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": "..."
}
uMa URL'a tam a daxwazê ye, bi waya ku stringa query jî tê de heye, tam wekî ku hatî şandin.methodmetoda HTTP ye.payloadMa SHA-256 yê laşê daxwaza xav (raw request body), bi hex e. Ew li ser pêwîst ePOSTûPATCH, û ew laşê ku tu dişînî divê byte bi byte wekî ew be ku te hash kir.created_atdivê di navbera 60 saniyeyên saetê ya serverê de be.- Her bûyer yek caran dixebite, a
GETtê de heye, ji ber vê yekê headerekî hatî girtin nikare bête dubarekirin. Ji bo her daxwazê yekî nû îmze bike. Zêde bike...noncebi nirxekî tesadufî marke bike da ku du daxwazên di heman saniyê de hatine îmzekirin hîn jî ji hev cûda bin. - Guhertoya daxwazekî îmzekirî dikare herî zêde 64 KB be, û gava bende pêdivî hebe
Content-Type: application/json.
Daxuyaniya bûyereke winda vedigerîne 401 missing_nostr_auth; yek ku bi awayekî xerab
hatiye amadekirin, bi awayekî xerab hatiye îmzekirin, pir kevin e, an ji bo URL, rêbaz an laşekî cuda ye, vedegere
invalid_nostr_auth, bi sedema di peyam de; yekî dubare kirî vedigerîne
nostr_auth_replayed. Clavîkey API ya ku ji van endpointan re tê şandin tê redkirin. Navnîşan berî ku laş bê xwendin tê kontrolkirin, û her sernav dikare 30 caran di deqîqeyekê de bi ser nebe (sernavek IPv6 wekî hemû /64 tê hesibandin); piştî wê... 429 bi / digel
Retry-After.
Browser dikarin van endpointan tenê ji malperên Nymbot ên taybet ve bixwazin (https://nymbot.ai,
https://nymchat.app û subdomên wan). Rûpelke yek li ser her malpereke din sernavên CORS werdegirtin nîn in, loma nikare bixe xebatê tiştê ku ew vedigerînin. Skript û aplikasyonên natîv, yên ku tu tişt naxwînîn
Origin, ne bandor dibin.
Navşandina (Signing) pêdivî bi kîlya sêrt a nym'ê te heye (the nsec), ku her tişt kontrol dike: nasnameya te, dîroka te û hejmara te. Tenê di skriptekê de li ser makineyekê bixe ku tu pê bawer dikî, li şûna ku di nav fîlekê de binivîsî, ji hawirdorê bixwîne, û dema tu dikarî amûr (app) tercîh bike.
Ev alîkar serî (header) ava dikin. Mînakên piştre yên li vê rûpelê wan bikar tînin. Ew kuncê sêrî bi hex dixwînin ji NOSTR_SECRET_HEX; ew ê cURL bi kar tîne
nak %{tool-a command-line}, ku pergaleke nsec an hex digire, û sha256sum (li ser 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");
}
Kurteya hesabê
Çi li serê pelê API yê aplikasyonê nîşan dide: koda we ya giştî, her du hejmarên bejayî, çend kunc (keys) çalak in (ne bêîzin û ne jî bi dawî bûne), û tije kirina otomâtîk tesbîtkirin, an jî
null Dema server wan pêşkêş nake.
GET https://nymbot.ai/api/v1/account — hewceydar e daxwaza îmzekirî.
Bersiv
{
"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());
Birêvebirina mîleyan
Endpointên li pişt lîsteya kuncên aplikasyonê. Divê hemû yên wan... daxwaza nimûdeya îmzekirîHer keng tê deguherîne bi vê şêweyê, bi demên ISO 8601 û bi mîqdarên sats:
Objekta sereke
{
"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 Naskirina klîlek bes e, lê bikaranîn nake. Klîk bi xwe tenê carekê tê vegerandin, dema ku tê çêkirin.
Lîstirkirina kuncan
GET https://nymbot.ai/api/v1/keys — îmze hat.
| Zevî | Tîp | Pêwîst e | Wate |
|---|---|---|---|
include_revoked | boolean (pirsiyar) | Na | Klavên bêîdeqet bimeşîne. Default false. |
Bersiv
{ "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);
Çêkirina mifteyekê
POST https://nymbot.ai/api/v1/keys — îmze hat. Vegerîn 201.
| Zevî | Tîp | Pêwîst e | Wate |
|---|---|---|---|
name | tîrêj | Erê | 1 heta 40 karakter, ji çalîyên te yên din ên çalak cuda (ji bawerîna herfên mezin û biçûk dûr bikeve). |
limit_sats | hejmarê tam | Na | Sata di nav xeranjînê de, her Dubarî 1. Ji bo bê sînor, wê li wir neyîne. |
reset_period | tîrêj | Na | daily, weekly an monthlyPêwîstî limit_satsJi bo kapa ku tu carî nabe reset, li derve bihêle. |
expire_at | tîp an hejmar | Na | Dema ku kunc tê sekinandin: demeke ISO 8601, an jî milisaniyekên ji sala 1970'an vir ve. |
Bersiv (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"
}
}
| Rewşa | Kengî |
|---|---|
400 | Navê winda an pir dirêj; navê ku jixwe tê bikaranîn (duplicate_name); sînorê ku ne hejmareke tam e ya herî kêm 1; serdemeke resetê bê sînor; demeke derbasbûyî; qadeke ne naskirî (unknown_parameter); an 25 kuncên çalak hene (too_many_keys). |
429 | Zêdetirî 60 klavî ji aliyê vê nîmayê ve hatine çêkirin, an jî 120 ji vê sernavê, di saetekî de (rate_limit_exceeded, bi 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);
Xwendina yek kuncî
GET https://nymbot.ai/api/v1/keys/{id} — îmze hat.
Vegerrin {"data": {…}} bi objekta serî, an jî 404
key_not_found eger tu nekarî tu kuncên xwe yên ku ew ID hene bibînin.
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);
Guherîna kuncikê
PATCH https://nymbot.ai/api/v1/keys/{id} — îmze hat.
Her yek ji... bişîne name, limit_sats, reset_period û
expire_at, bi heman rêzên wekî dema çêkirina ahu (key) kiriye. null tu sînor tune, reset tune, dema derbasbûna tune. Guhertina serdema resetê, serdema nû li ser sifrê destpê dike.
Keyeke revoke kirî nayê guhertin (400 key_revoked). Vegerandina
{"data": {…}} bi obyekta kunc a nûkirî.
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);
Betalkirina kuncikê
DELETE https://nymbot.ai/api/v1/keys/{id} — îmze hat.
Kîlê bi carê, bi temamî diqetîne. Ew di lîsteyê de bi ... dimîne. revoked_at hatî danîn, û
dikare bi ... re were dîtin include_revoked=trueBetalkirina kuncê ku jixwe hatiye betalkirin bersivê bi heman şêweyî dide. Tenê 50 kuncên revokkirî yên herî nû têne parastin; yên kevn dema kunceke din tê betalkirin têne jêbirin.
Bersiv
{ "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
Bi Nostr Wallet Connect navbandega Lightning girê bide û dema ku xarna API kêm bibe, Nymbot bi xwe hejmarê zêde dike. Pelê API yê sepana heman sêteyan nîşan dide; ev endpointên li pişt wê ne. Divê hemûyan... daxwaza îmzekirî.
Çawa dixebite: piştî ku daxwazek API ji hejmara ku te ji bo temaşekirinê hilbijartiye tê daxistin, heger ew hejmar ket di bin rêberê te de de, Nymbot ji bo mîqdara te ya zêdekirinê faturayekê amade dike, ji hejmara te (wallet) daxwaz dike ku wê bideye dan û krediyê lê zêde dike. Ew her 5 deqîqeyê carekê, herî herî zêde, ji bo her nym û hejmarekê re zêdekirinê dike, ji ber vê yekê bultika daxwazan nikare hejmara te vala bike. Xerckirin di sepanan de vê naxîne ser. Dem û mezinahiya dawî ya zêdekirinê, û hevçûna dawî, di sazdan de ne; heger piştî şaşiyekê daxistin bi ser ketibe, kontrolkirina faturaya wê bi rewşa zêdekirina bilancê kerem bike.
Strungeke girêdanê rê dide her kesê ku wê di destê wî de be, ji peywata te re daxwaz bike ku bide. Nymbot
wê bi şîfre ve dihêle û tenê ji bo daxistina faturayên xwe yên top-upê bi kar tîne, lê ji bo vê yekê tenê
girêdanekê çêbike, bi budçeyeke xercê di peywata te de, da ku herî zêde ku bikaribe bide jimarê ku te hilbijart.
Peywata pêwîst e ku piştgirî bide pay_invoice.
Connectkirina hewzê (wallet)
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — îmze hat.
| Zevî | Tîp | Pêwîst e | Wate |
|---|---|---|---|
nwc_url | tîrêj | Erê | Navnê girêdanê, destpêkirin nostr+walletconnect://. Nymbot ji hewldêr (wallet) daxwaz dike get_info berî ku meriv bi serê xwe bide/bi serê xwe bide, û wê bi şîfre veดี hildigire. |
threshold_sats | hejmarê tam | Erê | Dema ku balance di bin vê hejmarekê de ket, zêde bike. Herî kêm 1,000. |
topup_sats | hejmarê tam | Erê | Her car çend zêde bikin. 1,000 heta 1,000,000 sats. |
tier | tîrêj | Na | pro (yê default) an jî standard: hejmarê ji bo temaşekirin û zêdekirinê. |
Bersiv
{
"data": {
"connected": true,
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
"last_topup_at": null,
"last_topup_sats": null,
"last_error": null
}
}
| Rewşa | Kengî |
|---|---|
400 | Ne gotina peywendiyê ye (invalid_nwc_url); mêwan (wallet) li ser relayê bersiv nedan (nwc_unreachable) an jî checkê red kir (nwc_rejected); peywendî nikare faturayan bide bixistin (nwc_missing_permission); an jî mîqdarêke di derveyî sînoran de. |
501 | Zêdekirinên otomatîk ji bo vê serverê ne hatine vekirin (nwc_unavailable). Hem heman tişt ji bo du xalên dawî jî tê. |
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());
Xwendina sîtewendiyan
GET https://nymbot.ai/api/v1/nwc-auto-topup — îmze hat.
Heman obyekti wekî girêdanê vedigerîne, bi connected: false û qadên din
null dema tu ji çayangkan (wallet) re nexebandî bî. Navê rêznameya veqetandinê (connection string) bi xwe qet nayê vegerandin.
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());
Veqetandin
DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection — îmze hat.
Rewşa girêdana hatiye tesîrkirin jêdelake. Tiştên din nayên zêdekirin. Ji bo piştrastbûnê, hûn dikarin girêdanê di hewala xwe de jî betal bikin.
Bersiv
{ "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());
Bêyî kîyek, ji bo her daxwazê heqdan
Endpointên bi bihayê fiks dikarin li ser Lightning bi her car bi yek daxwaz werin dan, bê kunc,
bê hesab û bê bakiye: POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations û POST /embeddings. Chat, Bersiv û
Peyaman her tim pêdivî bi mifteyekê hene. Daxwazek ku mifteyekê li xwe digire, wekî her tim ji hejmarê (balance) tê daxistin;
流程a paymentê tenê dema ku tu mifte nîşan nedî dest pê dike.
Nymbot du wersemên heman ramanê diaxife, ji yek backend: Lightning Labs'
L402 (bi navê kevn ê xwe jî hatî qebûlkirin, LSAT) û tasnîna IETF
Dozî/Dozîn Bi şêwazê autentîkasyona HTTP re lightning metod û
charge nîşane. Bikar bîne ka yekê mijarê fêm dike.
Bê kuncavî danêdan tenê dema ku... API_L402_SECRET herî kêm 32 byte yên tesadufî dihewîne, wek hex (64 karakter) an base64 (44). Yekî bi çêbike bi openssl rand -hex 32Gihîştina bi nirxeke kurt an jî diku bê ku bi hêsanî were hesibandin, taybetmendiyê paş ve dike û wekilî dike ka çima. Ji bo vegerandina wê, nirxa kevin bibe API_L402_SECRET_PREVIOUS ji bo rojekê: nasname, URL-ên rewşê û
pîvanên di bin wê de hatine kirin heta ku bibe temen kar dikin.
Zeherî
Daxwazê bêyî nothing bişîne Authorization serî. Heke ew rast be, tişt naxebite, û
tu bi dest dixî 402 Payment Required bi faturayekê ji bo tam qîmeta ew daxwazê: bi heman bihayî ku keyek bide, ku li ser bingeha 10 sat ji bo krediyeke standard an 100 sat ji bo krediyeke Pro tê guhertin û tê vegerandin bo yekî satê tam (her biçûk 1 sat, û her biçûk minimuma 0.05 krediyê). Bersiv sê [tiştan] digire. WWW-Authenticate mînakên dijwar ji bo heman faturayê:
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 }
}
Derezî/Derezîya Pereyî request parametre base64url JSON e:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
Ber sfidaheke bi xalê dawiyê ve girêdayî ye, ji bo... Content-Type (cûreya medyayê û, ji bo
multipart, sînorê wê) û ji bo SHA-256 ya bîtekên tam ên laşê ku te şand, û 15
دqiqeyan diguhere. Piştî dravdanê, bişîne wek hev dîsa daxwaz bike: heman tişt
Content-Type û heman byte-ên JSON, an ji bo endpointên multipart
(/images/edits, /audio/transcriptions, /audio/translations) endamekî multipart ê bi heman sînor. Piraniya libreriyên HTTP her carê ku kefen dikin formekê sînoreke nû vedigirin, loma carekê kefen bike û wan byteyan du caran bişîne.
Her navnundê (address) dikare di navçeyek minutu de 30 törage (challenges) daxwaz bike (navnundêyek IPv6 wekî hemû /64 tê hesibandin).
Daxwazên ku navnundê yên wan nayên zanîn, di navçeyek 10an a herî hişrtir de parve dibin, û sînorê giştî yê törage yên ku Nymbot di nav hemû navnundan de dikeluarkan heye; daxwazeke ku berî töragekê hatibe redkirin (mînak bi laşekî ku JSON ê ne rast e) nabe sedem ku di nav wê de were hesibandin. Piştî wê, bersiv ev e 429 bi / digel Retry-After, berî ku laş (body) bê xwendin tê şandın. Endpointsên ku bêyî kunc an jî bi nasnameyek (credential) tên kirin jî di nav sînorê giştî yê 120 daxwazên bênasname yên her minîkî ji bo her navan de tên hesibandin. Nasnameyek berî ku laş bê xwendin tê kontrolkirin, û daxwazeke ku... Content-Type nîne application/json (an
multipart/form-data ji bo barkirinê) bi ... re tê redkirin 415 û qet fakturayê nakeve destê wî.
Bi tahmîna tokenên di nav inputê de, bi margîneke 1.5x, bi hebûna bihayî ye, ji ber ku hejmara rast tenê piştî wê tê zanîn. Tu ji bo wan tokenên ku bi rastî hatine bikaranîn biha didî, û beşê bihayê ku nehatî bikaranîn wekî wekî vedigerî tokenê vegerandinê.
Ez dravan dişînim
Bi her kîsa Lightning re faturayê bixşîne. Kîs preimage-ya te dide te, ku 64 karakterên hex in. Paşê
| Şema | Serlav |
|---|---|
| L402 | Authorization: L402 <macaroon>:<preimage> (LSAT kar dike jî) |
| Dozî/Dozîn | Authorization: Payment <base64url JSON>, li ku JSON heye {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}} |
Daxwazeke bi daxwazkirina pereyî tam wekî ya bi mifteyê tê kirin bersiv dide, bi tenê ew... nymbot
objekt nonezade qadên hejmarê (balance) tune ne: {"payment": "l402", "tier": "pro", "paid_sats": 237,
"charged_sats": 237}, û tuneye X-Nymbot-Balance-Sats sernav. A
daxwaz bi şemê Pere გადაştan (Payment scheme) hatîye dan, dibe ku... Payment-Receipt ser (base64url
JSON bi ID ya behre (challenge id), hash a dravdanê wekî reference, status û
timestamp). Daxwazên bi daxistin ne bi tu nym ve girêdayî ne, lewma di dîroka lêkolînê de n 나타 nadin.
| Rewşa | Kengî |
|---|---|
402 payment_already_used | Her dravdan ji bo yek daxwazê dihێت dan. Bersiv ji bo vê daxwazê wyê nû ye, lewma mişterîyek ku danasîna xwe ya dawî di cache de dihêle (wek lnget tenê dîsa dimeşîne. |
402 payment_mismatch | Belge ji bo endpointekî din hatibû cedirandin, Content-Type an laş, an jî bi vê daxwazê kêmît dikişîne niha bi pîvî temen e. Ji bo vê daxwazê nû challengeek bi xwe re tê; heke drav pir piçûk bû, ew yê ku te danî wekî ... vedigere tokenê vegerandinê (refund_token û refund_sats di laş de). |
402 payment_expired | Zêdetirî 15 deqîqeyan ji dema pêşbiriyê ve derbas bûn. Pêşbiliyeke nû bi wê re tê. Ger preimage nîşan bide ku te danasîye, tiştê ku te danî wekî... vedigere. tokenê vegerandinê (refund_token û refund_sats di laş de), carekê; piştî wê jî navçeyê (credential) tê bikaranîn û dibe ku biqede. |
401 invalid_preimage | Preimage bi haseya dravdanê ya faturayê re naxwîne. Dravdan ne hatiye temamkirin. |
401 invalid_payment_credential | Nasname şaş e, piştî ku Nymbot wê derxistiye guheriye, an jî navê hash-ê dravdanê dide ku Nymbot qaydeya dravdanê (invoice) ji bo wê derxnê kiriye. Macaroonek bi şerteke (caveat) ku Nymbot nizanibe, an jî bi şertên cudabûnê, tê redkirin. |
429 rate_limit_exceeded | Zêdetirî 30 nasname an kuncên ku di minekê de di proven kirinê de nehatine pejirandin ji vê navan hatine, an jî yek tókên vegerê (refund token) di minekê de zêdetirî 60 caran hatiye şandin. Li benda... 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"));
Klientên li ser hatine avakirin mppx bi rêbazeke Lightning, pêşbiriya Hejdebûnê (Payment challenge) bi xwe birêve bibe; wan bişîne ser endpointê û rê bide ku hejdebûnê bikin.
Vîdyo
Parêziya peydakirî POST /videos bersiv 202 wekî yekî bi kunc, vê re a
status_url: GET bêyî tu kuncikekê ji bo derbasbûna kar. Ew hatiye îmzekirin
û ji bo 24 saetan dixebite, heta ku kar bê xeraq kirin.
{
"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..."
}
}
Bimîne refund_token Ji vê bersivê re: tenê li vir tê nîşandan. Dema ku vîdyo render dibe, wê vala ye (GET /api/v1/l402/refunds bersiv "status": "pending");
heke render bê dakuşandin bihev neke, dravdan dikeve ser wê. URL-a rewşê nîşan dide
refund_sats ji bo karê ku pereyê wî hatibe vegerandin lê token hîn nehatî, lewma parvekirina URLê rewşê (status URL) vegerandina pereyî parve nake. Kontrolkirina tokenê jî karê ku têk çû û kesî lê nepirsiye (polled) çareser dike.
Vegerandin
Heke daxwazeke bi daxistin bihev neçe û pêşkêşkar ji bo wê hewildanê ji Nymbot re faturayê şandibe, drav tê parastin û
şaşî dibêje weha, bi charged_sats, taybet wekî daxwazeke bi mifte (keyed) tê kirin. Heke bêyî ku heqê wê were daxistin bihev neke, xeletî xwe vedegirîne tokenê vegerandinê bi nirxê wê ku te xerîj kir:
{
"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"
}
}
Parçeyên nekarî hatine bikaranîn bi heman awayî vedigerin: heke te du wêneyan xwestibû û yek nebaş bû bê faturahî,
bersiva serkeftinê ye nymbot objekt ji bo yê windabûyî tokene vegarê (refund token) dihewîne;
transkripsiyoneke ku wekahiya wê nehatibû xwendin di destpêkê de, bi bihayê herî dirêj ê ku dibe ku dosya bibe tê fîgurkirin (qet ji 30 jî dirêjtir nabe), û cudahiya ji wekahiya rastîn wekî tokene vegarê vedigere; heke der bidet ku ji 30 jî dirêjtir be, bi ... tê redkirin 413
û hemû drav dizeviya ve. Embeddings tiştê ku nirxandin daxistin veguherandina ve. Vîdyoyeke bi ser neketî daxwaza vegerandina tokenê dike ku bi pêşniyara wê ve hatibû vegerandin.
Tokena vegerê koda 256-bit a tesadufî ye. Nymbot tenê hashê wê dişîne, û piştî 30 rojan bi dawî dibe. Ew hebalek sat dihewîne, û tu dikarî:
- Bi wê bixe. Iradêke
Authorization: Bearer REFUND-…li ser her yek ji endpointên jorîn (OpenAI SDK wê wekî API keyê xwe digire). Bihayê ji tokenê tê daxistin û ya ku mayî li ser dimîne (refund_token_satsdinymbotobjekt). Tokenek ku nirxê wê kêmtir e ji bersivên daxwazê402refund_insufficient; têkçûneke nehatî faturakirin, satan vedixîne ser heman tokenê. - Kontrol bike.
GET /api/v1/l402/refundsbi heman sernavî vedegere{"sats": 237, "status": "open", "expires_at": "..."}. - Li her deqîqeyê dikarin her tewken (token) heta 60 caran bikar bînin.
- Bikîne nîmayekî (nym). Bikêşe nav... Hediyeyekê vegirtin di
app a Nymbot de, an jî telefon bike
POST /api/v1/l402/refunds/redeembi a daxwaza îmzekirî û{"refund_token": "REFUND-...", "balance": "standard"}(an"pro"). Hemû kredî diçin balance (her yek 10 sats li ser standard, 100 li ser Pro); satsên ku krediyeke temam naxin li ser token dimînin ji bo daxwazê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"
Bersiv
{ "data": { "credited": 23, "tier": "standard", "balance_credits": 123, "remaining_sats": 7 } }