Bilim binýady Programmistler
Balans, ýüklemeler we açarlar
Näme eýýäm bar bolsa barlaň, Lightning arkaly hasap dolduryň, öz waletiňizden awtomatik hasap dolduryň, her bir soragyň bahasy näçä düşendigini görüň we açarlary kod arkaly dolandyryň.
Bu sahypa amatlylyk üçin maşyn terjime edilýär. Iňlis asyl nusgasy ulanylýan wersiýa.
Balansı barlamak
Ikiňiziň hem balanslary we bu açaryň limitiniň näçe bölegi ulanylýandygy.
GET https://nymbot.ai/api/v1/credits/balance — API açary gerek. POST şol bir wagtda, muny garaşýan müşderiler üçin hem işleýär.
balance häzirki Bitcoin bahasyna görä, iki balans dolanyşykda dollarda bir san garaşýan gurallar üçin (null eger baha okap bolmasa). Galany bolsa
kreditlerde we satslarda, balanslar aslynda şeýle saklanýar. key sorany açary häsiýetlendirýär. Çäkine ýeten açar heniz hem balansy barlap bilýär.
Jogap
{
"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 | Haçan |
|---|---|
401 | Açar tapylmady, bilinmeýän, iptal edilen ýa-da möhleti geçen. |
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);
Töleg usullary
Nädip hasap dolduryp biljekdigiňiz we çäklendirmeler. Lightning ýeke-täk usuldyr.
GET https://nymbot.ai/api/v1/topup/payment-methods — açary gerek däl.
Hasap doldurmak 10-dan 1,000,000 sats-a çenli; Pro hasap doldurmak azyndan bir Pro kredidi satyn almaly, şonuň üçin ol
100 sats-dan başlanýar. Dollaryň çägi Bitcoin baharyna baglydyr. bulk_bonus ulyrak ýüklemeler üçin goşmaça kreditleri sanaw berýär, programmadaky ýaly: 500, 1,000 ýa-da 5,000 sats-dan başlap standart ýüklemeler üçin 10%, 15% ýa-da 20% artykmaç, Pro ýüklemeler üçin bolsa 5,000, 10,000 ýa-da 50,000 sats-dan başlap artykmaçlyk berilýär.
Jogap
{
"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);
Lightning arkaly hasap doldurmak
Nym açary degişli bolan hasaba kredit goşýan Lightning hasap-faktoryny döredýär. Ony islendik Lightning walleti arkaly töleň, soňra barla krediti goşdurmak üçin.
POST https://nymbot.ai/api/v1/topup/create/btc-lightning — API açary gerek.
| Meýdan | Görüş | Talap edilýär | Beýany |
|---|---|---|---|
amount | san | Hawa | Näçe, ... currencySats üçin bitin san. |
currency | ýazgy | Ýok | SATS (başlangyç), USD ýa-da BTCDollarlar häzirki Bitcoin bahasy boýunça üýtgedilýär. |
tier | ýazgy | Ýok | pro (başlangyç) ýa-da standard: haýsy balanslara kredit barmak berilýär. |
Standart kredit 10 sats we Pro krediti 100 sats, üstüne islendik köp mukdarlyk bonusy;
credits bu hasap-faktura näme goşjakdygyny aýdýar.
Jogap
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"payment_request": "lnbc100u1p5...",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": "2026-09-30T09:27:00Z",
"status": "pending"
}
| Status | Haçan |
|---|---|
400 | Ýoluň içindäki başga bir usul (unsupported_method), näbelli walýuta (unsupported_currency) ýa-da dereje, ýetmezlik edýän mukdar ýa-da minimal mukdardan pes mukdar (amount_too_small), 1,000,000-dan ýokary sats (amount_too_large) ýa-da Lightning bitkoin goşundysy tarapyndan ret edildi (amount_out_of_range). |
429 | Bu nym üçin 60-dan köp inwois ýa-da şu salgydan bir sagadyň dowamynda 120 inwois (rate_limit_exceeded, bilen Retry-After). |
502 | Häzirlikde hiç hili hasap-faktura döredip bolmaýar (invoice_unavailable, bilen 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);
Hasaplaşygy barlamak
Hasap-fakturanyň tölenendigini soraýar we tölenilen bolsa, kredit goşýar. Barlag ony kreditleşdirýär, şonuň üçin tölenenden soň, status ... bolýança barlamaly. credited. Soňra täzeden barlamak howpsuz: siz näçe gezek soraň hem, kredit diňe bir gezek hasaba alynýar.
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — haswalat (invoice) düzüp beren nym-dan açar gerek.
status дыр pending (heniz tölenmedi), paid (tölenen, ýöne heniz
hasaplanan däl; täzeden barlaň), credited (balansiňyzda) ýa-da expired (wagtynda
tölenmedik). Balans meýdançalary faktura tarapyndan doldurylýan dereje üçindir.
Jogap
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| Status | Haçan |
|---|---|
400 | ID, dörediş (create) çagyryşyndan gelen 64 belgili ID däl. |
404 | Şol ID boýunça siziň nym üçin hiç hili hasap-faktura ýok (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);
Sorgu taryhy
Her sorag üçin bir setir: näme bolandygy, haýsy model, näçe token we bahasy. Hiç hili prompt ýa-da jogap saklanmaýar, şonuň üçin hem hiç hili zat yzyna berilmeýär. Setirler 90 gün saklanýar, iň täzeler birinji sırada. Çäk ýetmiş açary öz taryhyndan maglumat okap bilýär.
GET https://nymbot.ai/api/v1/queries/history — öz soraglaryny görýän API açaryny gerek, ýa-da gol çekilen sorat her bir açaryň görýän nym-yňdan.
| Meýdan | Görüş | Talap edilýär | Beýany |
|---|---|---|---|
page | bit (sorag) | Ýok | Standart 1, iň köp 1,000; ýokary sahypa bolsa 400 invalid_value. |
page_count | bit (sorag) | Ýok | Saž per pagina. Standart 20, iň köp 100. |
start_dateend_date | setir (sorag) | Ýok | ISO 8601 seneleri ýa-da wagtlary. |
model | setir (sorag) | Ýok | Diňe şu model. |
type | setir (sorag) | Ýok | chat, responses, messages, image, video, speech, transcription ýa-da embedding. |
all_keys | boolean (sorag) | Ýok | Açar bilen: true şol bir nym-y bolan ähli açarlary öz içine alýar. Default false. |
key_id | setir (sorag) | Ýok | Gol çekilen ýüzlenme bilen ýa-da all_keys=true: diňe şu açar. |
Jogap
{
"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);
Hasap soraglaryna ymza goýmak
Açmak, üýtgetmek we ýatyrmak üçin açarlar, hasabyň gysgaça mazmuny we awtomatiki ýüklemeler API açaryny talap etmeýär. Olar siziň nym-yňyzyň gol çekmesini talap edýär, şonuň üçin sızan açar öz çägi çenli serişde ulanyp biler, ýöne hiç wagt täze açar döredip ýa-da öz çägini ýokarlandyryp bilmez.
Programma muny siziň üçin edýär: ähli zat öz ýerinde API tab bu uçgünleri ulanýar. Siz diňe öz kodyňyzdan açarlary dolandyrmak üçin şu bölüm gereklidir.
Gol ýazgy 27235 görnüşli (NIP-98) Nostr wakasydyr, base64 formatynda ugradylýar
Authorization sözli hedeý Nostr öňünde:
Çäre
{
"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": "..."
}
usoragyň doly URL-esy, sorag setiri bilen bilelikde, takyk ugradylan görnüşindedir.methodHTTP usulydyr.payloadbu çykyşyň (raw request body) hex görnüşindäki SHA-256 hasaplamasydyr. Ol talap edilýärPOSTwePATCH, we iberýän göwrümiňiz hashlanylan göwrüm bilen bit-bit laýyk gelmelidir.created_atserweriň sagadyna 60 sekundyň çägiresinde bolmaly.- Her bir waka bir gezek işleýär, a
GETgoşuldy, şonuň üçin ýakalanylan sarlawja gaýtadan ulanylyp bilinmez. Her sorag üçin täzesini gollaň. Bir...nonceTäg random gymmat bilen berilsin, şunda bir sekundyň dowamynda gol çekilen iki sany sorag hem biri-birinden tapawutlanar. - Gol çekilen soragyň gövdesi iň ýokary 64 KB bolup biler we gövde gözlem gerek
Content-Type: application/json.
Ýitirilen waka dolanýar 401 missing_nostr_auth; ýalňyş emele getirilip, ýalňyş gol çekilen, örän köne ýa-da başga URL, usul ýa-da gövde üçin bolan bolsa, şular gaýtarylyp berilýär
invalid_nostr_auth, habaryň içindäki sebäbi bilen; gaýtadan ulanylan bolsa yzyna gaýtarýar
nostr_auth_replayedBu ugurlara iberilen API açary ret edilýär.
Gövdesi okalmazdan ozal gol luk (signature) barlanýar we her salgy bir minutda 30 gezek bökdençlige uçrap bilýär (IPv6 salgysy özüniň bitewi /64 hökmünde hasaplanýar); şondan soňra ol 429 bilelikde
Retry-After.
Brauzerler bu uç noktalary diňe Nymbot-yň öz saýtlaryndan çagyryp biler (https://nymbot.ai,
https://nymchat.app we olaryň podomenleri). Başga islendik saýtyň sahypasy CORS
sargytlaryny almaz, şonuň üçin olar tarapyndan gaýtarylýan maglumatlary okap bilmeýär. Skriptler we tebigy programmalar, olar hiç hili
Origin, täsir etmez.
Gol çekmek üçin nym-yňyzyň gizlin açary gerek ( nsec), ol ähli zady dolandyrýar: siziň kimligigiňizi, taryhyňyzy we balansiňizi. Ony diňe ynanyşýan maşynyňyzda skriptiň içine goýuň, ony faýla ýazmak deregine gurşawdan (environment) okaň we mümkinçilik bolsa goýumy (app) ulanmagy artyk görüň.
Bu kömekçiler sarlawy guraýarlar. Bu sahypadaky soňky mysallar olary ulanýar. Olar gizlin açary hex görnüşinde okap alýarlar NOSTR_SECRET_HEX; cURL-li görnüşi ... ulanýar
nak nsek ýa-da hex açaryny kabul edýän komanda setiri arkaly işleýän gural, we sha256sum (macOS üstünde, 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");
}
Hasabyň jemlemesi
Programmanyň API sahypasynyň ýokarsynda näme görkezilýär: siziň açyk açaryňyz, her iki balans hem, näçe açaryň işjeňdigi (pese düşürilmän ýa-da möhleti geçmedik) we... awtomatiki ýükleme sazlamalar, ýa-da
null serwer olary hödürlän wagty däl.
GET https://nymbot.ai/api/v1/account — gerek gol çekilen sorat.
Jogap
{
"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());
Açarlary dolandyrmak
Programmanyň açar sanawy arkaly gelen uç nokatlary. Olaryň ählisiniň ... gerek gol çekilen soratHer bir açar ISO 8601 formatyndaky wagtlar we sats görnüşindäki möllümdeler bilen şu görnüşde gaýtarylýar:
Esasy obýekt
{
"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 açary tanamak ýeterlikdir, emma ony ulanmak üçin däl. Açaryň özi diňe bir gezek, ol taýýarlanan wagty yzyna berilýär.
Açarleri sanaw etmek
GET https://nymbot.ai/api/v1/keys — gol çekildi.
| Meýdan | Görüş | Talap edilýär | Beýany |
|---|---|---|---|
include_revoked | boolean (sorag) | Ýok | Ýatyrylan açarlary goş. Default false. |
Jogap
{ "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);
Açar ýasamak
POST https://nymbot.ai/api/v1/keys — gol çekildi. Gaýtarylyşlar 201.
| Meýdan | Görüş | Talap edilýär | Beýany |
|---|---|---|---|
name | ýazgy | Hawa | 1-den 40 çarka çenli, beýleki işjeň açarlaryňyzdan tapawutly (uly-kiçi harplary hasaba almazdan). |
limit_sats | bitin san | Ýok | Sats görnüşindäki çykdajy çägi, azyndan 1. Çäksiz bolmagy üçin ony boş goýuň. |
reset_period | ýazgy | Ýok | daily, weekly ýa-da monthlyMätäçlikler limit_satsHiç haçan täzelenmeýän çapyň üçin ony daşary goýuň. |
expire_at | string ýa-da integer | Ýok | Açar işlemege duran wagty: ISO 8601 wagty ýa-da 1970-nji ýyldan bäri geçen millisekundlar. |
Jogap (201)
{
"data": {
"id": "4f0c9a1be27d3856",
"name": "laptop scripts",
"hint": "sk-nymbot-Qm7x…c2Lw",
"limit_sats": 20000,
"reset_period": "monthly",
"key": "sk-nymbot-Qm7x...c2Lw",
"...": "the rest of the key object"
}
}
| Status | Haçan |
|---|---|
400 | Ýitirilen ýa-da gaty uzyn at; eýýäm ulanylýan at (duplicate_name); iň azyndan 1 bitin san bolmadyk çäk; çäksiz täzelenme döwri; geçmişdäki möhlet; bilinmeýän meýdan (unknown_parameter); ýa-da eýýäm 25 işjeň açar bar (too_many_keys). |
429 | Bir sagatda bu nym tarapyndan edilen 60-dan köp açar ýa-da bu salgydan 120 açar (rate_limit_exceeded, bilen 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);
Bir açary okamak
GET https://nymbot.ai/api/v1/keys/{id} — gol çekildi.
Gaýtarmalar {"data": {…}} esasy obýekt bilen, ýa-da 404
key_not_found eger siziň hiç bir açaryňyzda şol ID ýok bolsa.
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);
Açar çalşyrmak
PATCH https://nymbot.ai/api/v1/keys/{id} — gol çekildi.
Islendigini ugrat name, limit_sats, reset_period we
expire_at, açar ýasaýan wagtyndaky ýaly şol bir düzgünler bilen. null meýdançany arassalaýar: çäk ýok, täzelenme ýok, möhleti ýok. Täzelenme döwrüni üýtgetmek täze döwri nol nokadyndan başlatýar. Ýatyrylan açary üýtgedip bolmaýar (400 key_revoked). Dolanyşlar
{"data": {…}} täzelenen açar obýekti bilen.
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);
Açar ýatyrmak
DELETE https://nymbot.ai/api/v1/keys/{id} — gol çekildi.
Açarany bir wagtlygyna, doly saklaýar. Ol sanawda galýar bilen revoked_at belenen we ... bilen görüp bolýar include_revoked=trueEýýäm ləýen açary ýene ləýetmek şol bir jogaby berýär. Diňe iň täze 50 ləýen açar saklanýar; başga bir açar ləýedilende, köne açarlar öçürilýär.
Jogap
{ "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 awtomatiki hasaby doldurmak
Lightning walleti Nostr Wallet Connect bilen birleşdiriň we API çykdajylary peselende Nymbot balansı özbaşdak doldurýar. Programmanyň API listinde hem şol bir sazlamalar bar; bular onuň arkasyndaky ugurlar. Olaryň hemmesine bir gol çekilen sorat.
Bu nähili işleýär: API soragy saýlan balansyňyzdan düşürileninden soň, eger şol balans siziň bellenen çägiňizden aşyp gitse, Nymbot täzeเติม ediş mukdary üçin hasap-faktura düzýär, goşundy üçin töleg etmegi töwenge sorýar we krediti goşýar. Ol her bir nym we balans üçin iň köp 5 minutdan bir gezek täzelemäni amala aşyrýar, şonuň üçin soraglaryň köp bolmagy töwenge bolan serpişi çalt ýok edip bilmez. Programmalardaky çykdajylar muny işe düşürmeýär. Soňky täzelemäniň wagty we möçberi, hem-de soňky ýalňyşlyk sazlamalarda bar; eger ýalňyşlykdan soň töleg geçip dursa, ony hasap-faktura bilen barlamak... hasap doldurmagyň statusy kredit berýär.
Baglanyşyk setiri ony elinde saklaýan her kimiň siziň waletiňizden töleg etmegi soramaga mümkinçilik berýär. Nymbot ony şifrirlenen görnüşde saklaýar we diňe öz balansyny doldurmak üçin hasap-fakturalaryna töleg etmek üçin ulanýar, ýöne muny üçin diňe şol maksat bilen, waletiňizde çykdajy býujeti bilen baglanyşyk dörediň, şeýlelikde onuň iň köp töleýip biljek mukdary diňe siziň saýlan san bolup biler. Walet şuny goldamaly pay_invoice.
Öýjük birikdirmek
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — gol çekildi.
| Meýdan | Görüş | Talap edilýär | Beýany |
|---|---|---|---|
nwc_url | ýazgy | Hawa | Baglanyşyk setiri, başlap nostr+walletconnect://. Nymbot kepiçeden soraýar get_info ony ýatda saklamazdan ozal, ony şifranyň içinde saklaýar. |
threshold_sats | bitin san | Hawa | Balans şu mukdary satterden aşak düşende täzelemek üçin. Iň azyndan 1,000. |
topup_sats | bitin san | Hawa | Her gezek näçe goşmaly? 1,000-dan 1,000,000 sats-a çenli. |
tier | ýazgy | Ýok | pro (başlangyç) ýa-da standard: gözlemek we doldurmak üçin balansy. |
Jogap
{
"data": {
"connected": true,
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
"last_topup_at": null,
"last_topup_sats": null,
"last_error": null
}
}
| Status | Haçan |
|---|---|
400 | Baglanyşyk setiri däl (invalid_nwc_url); walet öz relýasy arkaly jogap bermedi (nwc_unreachable) ýa-da barlagy ret etdi (nwc_rejected); baglanyşyk hasap-fakturalary töley almaýar (nwc_missing_permission); ýa-da çäklerden daşary mukdar. |
501 | Bu serwer üçin awtomatiki ýüklemeler açyk däl (nwc_unavailable). Şol bir zat beýleki iki nokat üçin hem degişlidir. |
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());
Sazlamalary okamak
GET https://nymbot.ai/api/v1/nwc-auto-topup — gol çekildi.
Birikdiriş bilen birmeňzeş obýekti gaýtaryş, bilen connected: false we beýleki meýdançalar
null hiç bir walet birikdirilmän duran wagty. Birikdiriş setiriniň özi hiç wagt
gaýtarylmaýar.
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());
Baglanýan ýok
DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection — gol çekildi.
Saklanan birikdiriş setirini öçürýär. Indiki gezekde täzelenmeler edilmez. Ynamly bolmak üçin, siz birikdirişi öz waletiňizden hem ýatyryp bilersiňiz.
Jogap
{ "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());
Açar (key) ulanmazdan her sargyt üçin töleg etmek
Ajalan bahaly uçgünler Lightning arkaly her gezek bir sargyt üçin, açaryň, hasabyň we balansyň talap edilmezden tölenip bilner: POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations we POST /embeddings. Chat, Jogaplar we
Habarlaşmalar elmydama açar talap edýär. Açar daşaýan sorat adatdagy ýaly balansdan tölenilýär;
töleg akymy diňe açar iberilmän, ýagdaýynda başlanýar.
Nymbot bir backend-den bir ideanyň iki dürli wersiýasyny aýtýar: Lightning Labs'
L402 (şol bir wagtda köne ady bilen hem kabul edildi, LSAT) we IETF taslamasy
Töleg HTTP autentifikasiýa shemasy bilen lightning usul we
charge niýet. Müşderiňiziň haýsysyny düşünýän bolsa, şony ulanyň.
Açar bolmazdan töleg etmek diňe şu ýagdaýlarda mümkin bolýar API_L402_SECRET iň az azyndan 32 taslandyrylmadyk
baýt saklaýar, heks (64 simwol) ýa-da base64 (44) görnüşinde. Şeýle birini ýasalyň openssl rand -hex 32.
Gysga ýa-da çaklamaga bolan gymmatlyk funksiýany öçürýär we näme üçin öçenini ýazgy edýär. Ony aýlanlandyrmak üçin, köne
gymmaty şuny görkez: API_L402_SECRET_PREVIOUS bir gün üçin: agzalyk maglumatlary, status URL-leri we
olaryň esasynda döredilen synaglar möhleti dolanýança işlemegini dowam etdirýär.
Synag
Soragyny hiç zat goşmazdan iberiň Authorization header. Eger ol degişli bolsa, hiç zat işlemeýär we
siz alýarsyňyz 402 Payment Required şol soragyň bahasy näçä bolan bolsa, şol mukdary görkezýän hasap-faktura bilen:
açaryň töleýän bahasy bilen birmeňzeş, 1 standart kredit üçin 10 sats ýa-da 1 Pro kredit üçin 100 sats hasaplanyp,
olaryň dowamynda bitewi sat derejesine çenli (iň az 1 sat we iň az 0.05 kredit minimum) ýokarylandyrylyp:
jogap üç sanyda daşaýar WWW-Authenticate şol bir faktura üçin kynçylyklar:
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 }
}
Töleg request parametr base64url JSON:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
Kynçylyk nokada birikdirilen, o... Content-Type (onuň media görnüşi we,
multipart üçin onuň serhetleri) hem-de siz iberen göni gövde baýtarynyň SHA-256 koduna degişli bolup, 15
minut dowam edýär. Töleg eden bolsaňyz, şu aşakdakyny iberiň özdeş gaýtadan soraýaryn: şol birini
Content-Type we şol bir JSON baýtlary, ýa-da multipart uçpundaklary üçin
(/images/edits, /audio/transcriptions, /audio/translations) şol bir serhet bilen şol bir köp bölekli (multipart) gövde. Köp HTTP kitaphanalary formany kodlaýan her gezek täze serhet saýlaýarlar, şonuň üçin ony bir gezek kodlaň we şol baýtları iki gezek ugradyň.
Her salgy bir minutda 30 sany synag talap edip bilýär (IPv6 salgysy özüniň tutuş /64 bölegi hökmünde hasaplanýar).
Salgysy bilinmeýän soraglaryň sany has çäklendirilip, minutda 10 sany diýlip bellenildi we ähli salgylar boýunça Nymbot tarapyndan berilýän synaglaryň umumy çägi bar; synag edilmezden öň ret edilen sorag (mysal üçin, ýaramly däl JSON göwrümi bilen) bu çäge girmeýär. Ondan soňra jogap şudur: 429 bilelikde Retry-After, gövdesi okalmazdan öň iberilýär. Açarsyz ýa-da ygtyýarnama görkezilmezden çagyrylan tölenýän
ugrutlar hem adresiň her minutyna 120
tassyklanmadyk sorag limitine degişlidir. Ygtyýarnama gövdesi
okalmazdan öň barlanýar we sorag, haýsy... Content-Type däl application/json (ýa
multipart/form-data ýüklemeler üçin) ... bilen ret edilýär 415 we hiç wagt
hasap-faktura alamaýar.
Embeddings bahasy girişdäki tokenleriň takmynan sanyndan, 1.5× margina bilen hasaplanýar, sebäbi hakyky san diňe soňra belli bolýar. Siz hakykatda ulanylan tokenler üçin töleýärsiňiz we töleginiň ulanylmadyk bölegi size yzyna gaýtarylýar. gaýtaryş tokeni.
Tölegi ugradýaryn
Islendik Lightning walleti bilen hasaby töleň. Wallet size 64 hex simwolundan ybarat preimage berýär. Soňra şol bir soragy şu aşakdakylaryň biri bilen iberiň:
| Shema | Sarlawja |
|---|---|
| L402 | Authorization: L402 <macaroon>:<preimage> (LSAT hem işleýär) |
| Töleg | Authorization: Payment <base64url JSON>, JSON nirede {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}} |
Tölegli sorag, açar bilen edilýän sorag ýaly takyk jogap berýär, diňe... nymbot
objektde balans meýdançalary ýok: {"payment": "l402", "tier": "pro", "paid_sats": 237,
"charged_sats": 237}, we ýok X-Nymbot-Balance-Sats header. A
töleg mehanizmi bilen tölenen sorat hem alýar Payment-Receipt header (base64url
JSON bilen challenge id, töleg hasaby ýaly reference, status we
timestamp). Tölegli soraglar hiç hili nym bilen baglanyşykly däldir, şonuň üçin olar sorag taryhynda görünmeýärler.
| Status | Haçan |
|---|---|
402 payment_already_used | Her töleg bir sorag üçin tölenýär. Jogap bu sorag üçin täze bir synagdy, şonuň üçin iň soňky agzalygyny keshleýän müşderi (mysal üçin lnget şol bir wagtda ýene töleýär. |
402 payment_mismatch | Maglumatlar başga bir ugur üçin berildi, Content-Type ýa beden, ýa-da şu haýyşdan az töleg häzir bahalanýar. Bu haýyş üçin täze kynçylyk hem gelýär; eger töleg gaty az bolsa, tölenen zadyňyz gaýtadan ... bolup yzyna gelýär gaýtaryş tokeni (refund_token we refund_sats bedeninde. |
402 payment_expired | Synagyň üstünden 15 minutdan köp wagt geçdi. Onuň bilen täze synag gelýär. Eger prekimoň siz töleg edenigiňizi görkezse, töleýşiňiz şuna öwrülip yzyna gaýdýar: gaýtaryş tokeni (refund_token we refund_sats göwrümde), bir gezek; soňra şol maglumat bir gezeklik ulanylýar. |
401 invalid_preimage | Preimaj inwoýsyň töleg heşini emele getirmeýär. Töleg ulanylmady. |
401 invalid_payment_credential | Kimliknamanyň gurluşy nädogry, Nymbot ony bereninden soň üýtgedildi ýa-da Nymbot hiç wagt hasap-faktura bermedigi töleg häsiýetnamasyny görkezýär. Nymbot bilmeýän çäklendirmesi bolan ýa-da garşylaşýan çäklendirmeleri bolan macaroon ret edilýär. |
429 rate_limit_exceeded | Bir minut içinde bu salgytdan barlagdan geçip bilmedik 30-dan köp maglumat ýa-da açar geldi ýa-da bir gaýtaryş tokeni bir minutda 60-dan köp gezek iberildi. Garaşyň 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"));
Müşderiler şular esasynda gurlan mppx Lightning usuly bilen töleg meselesini özleri çözsinler; olary terminala gönükdiriň we tölemelerine rugsat beriň.
Wideolar
Tölenen POST /videos jogaplar 202 açary bolan ýaly, üstüne bir
status_url: GET işi dowam etdirmek üçin hiç hili açary ýok. Ol gol çekilen we iş saklanýan wagty 24 sagat dowam edýär.
{
"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..."
}
}
Saklaň refund_token şu jogapdan: ol diňe şu ýerde görkezilýär. Wideonyň render ediliş wagtynda ol boş bolýar (GET /api/v1/l402/refunds jogaplar "status": "pending");
eger render tölenen däl görnüşde başarýan bolsa, töleg oňa gelýär. Status URL görkezýär
refund_sats puly gaýtarylýan iş üçin, ýöne token hiç wagt gelmedi, şonuň üçin ýagdaýyň URL-sini paýlaşmak
puly gaýtaryşy paýlaşmaýar. Tokeni barlamak hem hiç kim tarapyndan barlanmadyk ýalňyş işi çözýär.
Gaýtaryşlar
Eger tölenýän sorag başar magnysyz tamamlanýan bolsa we üpjünçi Nymbot-dan synanyşyk üçin töleg talap eden bolsa, töleg saklanýar we ýalňyşlyk muny aýdýar, bilen charged_sats, edil açarli sorag üçin bolşy ýaly. Eger töleg alynmazdan ýalňyşlyk ýüze çyksa, ýalňyşlyk şuny aňladýar gaýtaryş tokeni tölenen pulyna degýär:
{
"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"
}
}
Ulanylmadyk bölekler şol bir görnüşde yzyna gaýdyp gelýärler: eger siz iki sany surat soraýan bolsaňyz we olaryň biri tölenmedik ýagdaýda başarısyz bolan bolsa,
üstünlik jogabyňyzyň nymbot mysulyň ýitirileniniň deregine gaýtaryş tokenini göterýär;
başdan okap bolmaýan uzynlygy bolan transkripsiýa faýlyň iň uzyn bolup biljek uzynlygy üçin baha berilýär (hiç wagt 30 minutdan köp däl) we hakyky uzynlyk bilen arasyndaky tapawut gaýtaryş tokeni hökmünde yzyna gaýtarylýar; eger 30 minutdan uzyn bolup çyksa, ol şular bilen ret edilýär 413
we tutuş töleg yzyna gaýdyp gelýär. Embeddings çaklamanyň saklap galan bölegini yzyna berýär. Ýalňyş wideo öz iberilen tokenine gaýtarylyş berýär.
Yol beriş (refund) tokeni 256-bitlik taslandyrylan koddyr. Nymbot diňe onuň hashtasynda saklaýar we ol 30 günüň dowamynda ýaramlydyr. Ol sat balansyny saklaýar we siz şulary edip bilersiňiz:
- Ondan töle. Itrlemek
Authorization: Bearer REFUND-…ýokardaky uç noktlaryň islendik birinde (OpenAI SDK ony öz API açary hökmünde kabul edýär). Baha tokendan alynýar we galan bölegi onda galýar (refund_token_satsiçindenymbotobyekt). Soragyň bahasyndan pes bolan token jogap berýär402refund_insufficient; tölenmedik ýalňyşlyk satları şol bir tokeniň üstüne gaýtaryp goýýar. - Barla.
GET /api/v1/l402/refundsşol bir sarlawag bilen gaýtaryar{"sats": 237, "status": "open", "expires_at": "..."}. - Bir token bir minutda iň köp 60 gezek ulanylyp bilner.
- Ony nym-a geçiriň. Onuň içine goýuň Hediýäni ulanmak Nymbot programmasynda ýa-da jaň edip
POST /api/v1/l402/refunds/redeembir ... bilen gol çekilen sorat we{"refund_token": "REFUND-...", "balance": "standard"}(ýa"pro"). Ähli kreditler balansyň hasabyna geçirilýär (standard üçin her biri 10 sats, Pro üçin 100 sats); bitin kredit emele getirmeýän satslar API soraglary üçin tokeniň içinde galýar.
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"
Jogap
{ "data": { "credited": 23, "tier": "standard", "balance_credits": 123, "remaining_sats": 7 } }