Skip nav naverokê
Vegere Nymbot

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.

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şaKengî
401Kunc 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îpPêwîst eWate
amounthejmarErêÇend, di... de currencyJi bo sats, hejmareke tam.
currencytîrêjNaSATS (yê default,) USD an BTCDollar bi bihayê Bitcoinê yê niha tê veguherandin.
tiertîrêjNapro (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şaKengî
400Metodeke 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).
429Zêdetirî 60 faturayên ji bo vê nymê, an jî 120 ji vê navnîşanê, di saetekî de (rate_limit_exceeded, bi Retry-After).
502Niha 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şaKengî
400ID, ID'a 64-karakterî ya ji call'a çêkirinê nîne.
404Bi 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îpPêwîst eWate
pageyekîna tam (pirs)NaDefault 1, herî kêm 1,000; rûpeleke bilindtir ev e 400 invalid_value.
page_countyekîna tam (pirs)NaRêz per rûpelê. Default 20, herî zêde 100.
start_date
end_date
tîp (pirsiyar)NaDîrok an demên ISO 8601.
modeltîp (pirsiyar)NaTenê ev model.
typetîp (pirsiyar)Nachat, responses, messages, image, video, speech, transcription an embedding.
all_keysboolean (pirsiyar)NaBi kileçekî: true hemû kîleyên bi heman navê (nym) digireve. Default false.
key_idtîp (pirsiyar)NaBi 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": "..."
}
  • u Ma URL'a tam a daxwazê ye, bi waya ku stringa query jî tê de heye, tam wekî ku hatî şandin.
  • method metoda HTTP ye.
  • payload Ma SHA-256 yê laşê daxwaza xav (raw request body), bi hex e. Ew li ser pêwîst e POST û PATCH, û ew laşê ku tu dişînî divê byte bi byte wekî ew be ku te hash kir.
  • created_at divê di navbera 60 saniyeyên saetê ya serverê de be.
  • Her bûyer yek caran dixebite, a GET tê de heye, ji ber vê yekê headerekî hatî girtin nikare bête dubarekirin. Ji bo her daxwazê yekî nû îmze bike. Zêde bike... nonce bi 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.

Êriya te ya sidırî

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îpPêwîst eWate
include_revokedboolean (pirsiyar)NaKlavê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îpPêwîst eWate
nametîrêjErê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_satshejmarê tamNaSata di nav xeranjînê de, her Dubarî 1. Ji bo bê sînor, wê li wir neyîne.
reset_periodtîrêjNadaily, weekly an monthlyPêwîstî limit_satsJi bo kapa ku tu carî nabe reset, li derve bihêle.
expire_attîp an hejmarNaDema 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şaKengî
400Navê 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).
429Zê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.

Berî ku tu mêwaniyê (wallet) girêdî

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îpPêwîst eWate
nwc_urltîrêjErê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_satshejmarê tamErêDema ku balance di bin vê hejmarekê de ket, zêde bike. Herî kêm 1,000.
topup_satshejmarê tamErêHer car çend zêde bikin. 1,000 heta 1,000,000 sats.
tiertîrêjNapro (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şaKengî
400Ne 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.
501Zê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.

Xizmeta sêrvêrê ya xwe birêvebirin

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şê

ŞemaSerlav
L402Authorization: L402 <macaroon>:<preimage> (LSAT kar dike jî)
Dozî/DozînAuthorization: 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şaKengî
402 payment_already_usedHer 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_mismatchBelge 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_expiredZê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_preimagePreimage bi haseya dravdanê ya faturayê re naxwîne. Dravdan ne hatiye temamkirin.
401 invalid_payment_credentialNasname ş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_exceededZê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_sats di nymbot objekt). Tokenek ku nirxê wê kêmtir e ji bersivên daxwazê 402 refund_insufficient; têkçûneke nehatî faturakirin, satan vedixîne ser heman tokenê.
  • Kontrol bike. GET /api/v1/l402/refunds bi 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/redeem bi 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 } }