Mazmuna geçiň
Nymbot-a yzyna gaýdyp

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ň.

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"
  }
}
StatusHaçan
401Aç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ýdanGörüşTalap edilýärBeýany
amountsanHawaNäçe, ... currencySats üçin bitin san.
currencyýazgyÝokSATS (başlangyç), USD ýa-da BTCDollarlar häzirki Bitcoin bahasy boýunça üýtgedilýär.
tierýazgyÝokpro (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"
}
StatusHaç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).
429Bu nym üçin 60-dan köp inwois ýa-da şu salgydan bir sagadyň dowamynda 120 inwois (rate_limit_exceeded, bilen Retry-After).
502Hä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
}
StatusHaçan
400ID, 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ýdanGörüşTalap edilýärBeýany
pagebit (sorag)ÝokStandart 1, iň köp 1,000; ýokary sahypa bolsa 400 invalid_value.
page_countbit (sorag)ÝokSaž per pagina. Standart 20, iň köp 100.
start_date
end_date
setir (sorag)ÝokISO 8601 seneleri ýa-da wagtlary.
modelsetir (sorag)ÝokDiňe şu model.
typesetir (sorag)Ýokchat, responses, messages, image, video, speech, transcription ýa-da embedding.
all_keysboolean (sorag)ÝokAçar bilen: true şol bir nym-y bolan ähli açarlary öz içine alýar. Default false.
key_idsetir (sorag)ÝokGol ç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": "..."
}
  • u soragyň doly URL-esy, sorag setiri bilen bilelikde, takyk ugradylan görnüşindedir.
  • method HTTP usulydyr.
  • payload bu çykyşyň (raw request body) hex görnüşindäki SHA-256 hasaplamasydyr. Ol talap edilýär POST we PATCH, we iberýän göwrümiňiz hashlanylan göwrüm bilen bit-bit laýyk gelmelidir.
  • created_at serweriň sagadyna 60 sekundyň çägiresinde bolmaly.
  • Her bir waka bir gezek işleýär, a GET goşuldy, şonuň üçin ýakalanylan sarlawja gaýtadan ulanylyp bilinmez. Her sorag üçin täzesini gollaň. Bir... nonce Tä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.

Siziň gizlin açaryňyz

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ýdanGörüşTalap edilýärBeýany
include_revokedboolean (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ýdanGörüşTalap edilýärBeýany
nameýazgyHawa1-den 40 çarka çenli, beýleki işjeň açarlaryňyzdan tapawutly (uly-kiçi harplary hasaba almazdan).
limit_satsbitin sanÝokSats görnüşindäki çykdajy çägi, azyndan 1. Çäksiz bolmagy üçin ony boş goýuň.
reset_periodýazgyÝokdaily, weekly ýa-da monthlyMätäçlikler limit_satsHiç haçan täzelenmeýän çapyň üçin ony daşary goýuň.
expire_atstring ýa-da integerÝokAç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"
  }
}
StatusHaç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).
429Bir 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.

Kössä birleşdirmänizden öň

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ýdanGörüşTalap edilýärBeýany
nwc_urlýazgyHawaBaglanyşyk setiri, başlap nostr+walletconnect://. Nymbot kepiçeden soraýar get_info ony ýatda saklamazdan ozal, ony şifranyň içinde saklaýar.
threshold_satsbitin sanHawaBalans şu mukdary satterden aşak düşende täzelemek üçin. Iň azyndan 1,000.
topup_satsbitin sanHawaHer gezek näçe goşmaly? 1,000-dan 1,000,000 sats-a çenli.
tierýazgyÝokpro (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
  }
}
StatusHaçan
400Baglanyş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.
501Bu 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ň.

Öz serweriňizi işletmek

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ň:

ShemaSarlawja
L402Authorization: L402 <macaroon>:<preimage> (LSAT hem işleýär)
TölegAuthorization: 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.

StatusHaçan
402 payment_already_usedHer 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_mismatchMaglumatlar 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_expiredSynagyň ü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_preimagePreimaj inwoýsyň töleg heşini emele getirmeýär. Töleg ulanylmady.
401 invalid_payment_credentialKimliknamanyň 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_exceededBir 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_sats içinde nymbot obyekt). Soragyň bahasyndan pes bolan token jogap berýär 402 refund_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/redeem bir ... 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 } }