İçeriğe atla
Nymbot’a Dönüş

Bilgi tabanı Geliştirici

Top-ups ve anahtarlar

Sahip olduğunuz şeyleri kontrol edin, Lightning'i üstlenin, kendi cüzdanınızdan otomatik olarak üstlenin, her isteğin maliyetini görünün ve koddan anahtarları yönetin.

Denge Kontrolü

Hem dengelerinizin hem de bu anahtarın kapağının ne kadarının kullanıldığı.

GET https://nymbot.ai/api/v1/credits/balance Bir API anahtarına ihtiyacınız var. POST Bunu bekleyen müşteriler için de geçerli.

balance Bitcoin fiyatı ile birlikte iki denge dolar, tek bir sayıyı bekleyen araçlar için (null Eğer fiyat okunamıyorsa). gerisi kredilerde ve sats'ta, bu da dengelerin gerçekte nasıl tutulduğunu gösterir. key Sorulan anahtarı tanımlar.Kapısına ulaşan bir anahtar hala dengesini kontrol edebilir.

Cevap

{
  "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"
  }
}
statüsüNe zaman
401Anahtar eksik, bilinmeyen, iptal edilmiş veya sona ermiştir.

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);

Ödeme yöntemleri

Nasıl yapabilirim, ve sınırları. yıldırım tek yöntemdir.

GET https://nymbot.ai/api/v1/topup/payment-methods Hiçbir anahtar gerekmez.

Bir top-up 10 ila 1.000.000 sats; bir Pro top-up en az bir Pro kredisi satın almak zorundadır, bu yüzden 100 sats ile başlar. bulk_bonus Daha büyük top-up'larda ek kredi listesi, uygulamada olduğu gibi: standart top-up'larda 500, 1.000 veya 5.000 sats'tan 10%, 15% veya 20% daha fazla ve 5.000, 10.000 veya 50.000 sats'tan Pro top-up'larda.

Cevap

{
  "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);

Şimşek Üzerine Tırmanış

Anahtarın ait olduğu nym'e kredi katan bir Lightning faturası oluşturur. kontrol et Krediyi eklemek için.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning Bir API anahtarına ihtiyacınız var.

alanıtürüİhtiyaçAçıklama
amountNumarasıEvetNe kadar, ne kadar currencySatı için tam bir sayı.
currencyString içinHayırSATS (Düzenleme için tıklayın) USD veya BTCDolarlar geçerli Bitcoin fiyatına dönüştürülür.
tierString içinHayırpro (Devamını Oku) veya standard• Krediye ne kadar para yatırılır.

Standart bir kredi 10 sats ve bir Pro kredi 100 sats, artı herhangi bir toplu bonus; credits Bu faturanın ne ekleyeceğini açıklayınız.

Cevap

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
statüsüNe zaman
400Yürüyüş yolunda başka bir yol (unsupported_methodBilinmeyen bir para birimi (unsupported_currencyAşağıdakilerden hangisi daha düşük veya daha düşük (amount_too_small100 bin TL’den fazla (amount_too_large) ya da Lightning cüzdanı tarafından reddedildi (amount_out_of_range).
429bu ilanı beğen Ağu 21 (rate_limit_exceededile Retry-After).
502Şu anda herhangi bir fatura yapılamaz (invoice_unavailableile 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);

Top-up kontrol etmek

Faturanın ödenmiş olup olmadığını sorar ve bir kez aldığında, krediyi ekler. creditedDaha sonra tekrar kontrol etmek güvenlidir: kredi bir kez, ne kadar kez sorarsanız.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - Faturayı yapan nym'den bir anahtar gerekir.

status bence pending (Şu ana kadar ödeme yapılmadı) paid (Ödeme yapıldı ama henüz kredi verilmedi; tekrar kontrol edin), credited (Bilgisayarınızda veya expired (Aynı zamanda ödeme yapılmamaktadır.)Bilanc alanları, faturanın üstünde yer alan seviye için geçerlidir.

Cevap

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
statüsüNe zaman
400ID, oluşturulan çağrıyı oluşturan 64 karakterli id değildir.
404bu ilanı beğen Oca 19 (no account by that id for your nim (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);

Tarih istiyor

İsteğe göre bir satır: neydi, hangi model, kaç token ve ne maliyeti var. Hiçbir talimat veya yanıt saklanmaz, böylece hiçbiri iade edilmez. Satırlar 90 gün boyunca saklanır, en yeni ilk. Kapıya ulaşan bir anahtar hala tarihini okuyabilir.

GET https://nymbot.ai/api/v1/queries/history - kendi istekleri gören bir API anahtarına ihtiyacı vardır, ya da Başvuru İmzalandı Her anahtarın anahtarını gören ninemden.

alanıtürüİhtiyaçAçıklama
pageÇözüm (Query)HayırVarsayılan 1, en fazla 1000; daha yüksek bir sayfa 400 invalid_value.
page_countÇözüm (Query)HayırSayfa başına satırlar. Varsayılan 20, en fazla 100.
start_date
end_date
String Hakkında (Query)HayırISO 8601 tarihleri ve saatleri
modelString Hakkında (Query)HayırSadece bu model.
typeString Hakkında (Query)Hayırchat, responses, messages, image, video, speech, transcription veya embedding.
all_keysBoolean (Çözümlü Çözüm)HayırBir anahtar ile : true Aynı anahtarın her anahtarını içerir.Default false.
key_idString Hakkında (Query)HayırBelirli bir başvuru ile veya all_keys=trueSadece bu anahtar

Cevap

{
  "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);

Hesap Başvuru Formu

Anahtarların oluşturulması, değiştirilmesi ve iptal edilmesi, hesap özetleri ve otomatik üst düzeyler bir API anahtarı almazlar. Onlar anahtarınızdan bir imzayı alırlar, böylece bir sızan anahtar kapısına kadar harcama yapabilir, ancak başka bir anahtar yapamaz veya kendi kapısını yükseltemez.

Uygulama sizin için bunu yapar: her şey Ateş Sheet bu anahtarları kullanır. Bu bölüm sadece kendi kodunuzdan anahtarları yönetmek için gereklidir.

İmza, 27235 (NIP-98) türünün bir Nostr olayıdır ve baz64 kodlu olarak gönderilir. Authorization Header kelimesi ile Nostr Önünde ise :

olayın

{
  "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 is the full URL of the request, query string included, exactly as sent. - isteğin tam URL'si, sorgu dizisi dahil, tam olarak gönderildiği gibi.
  • method HTTP yöntemi kullanılır.
  • payload SHA-256'nın hexadeciminde, ham isteği vücudunun SHA-256'sıdır. POST Ve PATCHGönderdiğiniz içeriğin içeriği ise, gönderdiğiniz içeriğin içeriğidir.
  • created_at Sunucu saatinin 60 saniye içinde olması gerekir.
  • Her etkinlik bir kez, a GET Kapatılan bir başlık tekrar oynanamaz. Her isteğe yeni bir başlık yazın. nonce Aynı saniyede imzalanan iki isteğin hala farklı olması için rastgele bir değerle etiketleyin.
  • İmzalanan bir isteğin vücudu en fazla 64 KB olabilir ve bir vücuda ihtiyaç vardır. Content-Type: application/json.

Kayıp Bir Olay Geri Dönüyor 401 missing_nostr_authKötü biçimlendirilmiş, kötü imzalanmış, çok eski veya farklı bir URL, yöntem veya vücut geri verir. invalid_nostr_authYine bir mesaj ile, bir geri döner. nostr_auth_replayedBu son noktalara gönderilen bir API anahtarı reddedilir. imzası vücut okunmadan önce kontrol edilir ve her adres dakikada 30 kez başarısız olabilir (IPv6 adresi /64 olarak sayılır). 429 ile Retry-After.

Bu web sitelerinin içeriği sadece web sitelerinin içeriği için kullanılabilir (https://nymbot.ai, https://nymchat.app Herhangi bir web sitesinde bir sayfa CORS başlıklarını geri almaz, böylece geri dönüşlerini okuyamaz. OriginAma etkilenmiyorlar.

Gizli anahtarınız

Anahtarınızın Gizli Anahtarı (The Secret Key of Your Nym) nsec), her şeyi kontrol eder: kimliğinizi, geçmişinizi ve dengelerinizi. Sadece güvenebileceğiniz bir makine üzerinde bir senaryoya koyun, dosyaya yazmak yerine çevrenizden okuyun ve mümkün olduğunda uygulamayı tercih edin.

Bu yardımcılar başlık oluşturur. Bu sayfanın sonraki örnekleri bunları kullanır. Hex'te gizli anahtarı okurlar. NOSTR_SECRET_HEXcURL one kullanır Gönül bir nsec veya hex anahtarı kullanan komut satır aracı ve sha256sum macOS için, 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");
}

Hesap Özetleri

Uygulamanın API sayfasında en üstte gösterilen şey: kamu anahtarınız, her iki anahtar da dengesizdir, kaç anahtar aktiftir (yani iptal edilmemiş veya sona ermiş değildir) ve Otomatik Top-Up ayarları veya null Servisler bunları sunmuyor.

GET https://nymbot.ai/api/v1/account İhtiyaç a Başvuru İmzalandı.

Cevap

{
  "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());

Anahtar Yönetimi

Uygulamanın anahtar listesinin arkasındaki son noktalar. hepsinin bir Başvuru İmzalandıHer anahtar bu formda, ISO 8601'te zaman ve sats miktarları ile iade edilir:

Anahtar Objektif

{
  "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 Bir anahtarı tanımak, ancak kullanmamak yeterlidir. anahtarın kendisi, oluşturulduğunda yalnızca bir kez iade edilir.

Anahtar Listesi

GET https://nymbot.ai/api/v1/keys İmzalıyız

alanıtürüİhtiyaçAçıklama
include_revokedBoolean (Çözümlü Çözüm)HayırAnahtarları iptal et. Default false.

Cevap

{ "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);

Bir anahtar oluşturmak

POST https://nymbot.ai/api/v1/keys Geri Dönüş - Geri Dönüş 201.

alanıtürüİhtiyaçAçıklama
nameString içinEvet1 ila 40 karakter, diğer aktif anahtarlarınızdan farklıdır (bu durumun göz ardı edilmesi).
limit_satsİnterneteHayırEn azından 1’e kadar harcama kapısı, kapı dışında bırakın.
reset_periodString içinHayırdaily, weekly veya monthlyİhtiyaçları limit_satsAsla geri yüklemeyen bir kap için bırakın.
expire_atString veya integerHayırAnahtar çalışmayı durdurduğunda: ISO 8601 zaman, ya da 1970'ten beri milisekundadır.

Çözümler (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"
  }
}
statüsüNe zaman
400Kayıp veya çok uzun bir isim; zaten kullanılan bir isim (duplicate_name( 1 ); en az 1'in tam sayısı olmayan bir kapak; bir kapak olmadan yeniden ayarlanma süresi; geçmişteki bir sona erme; bilinmeyen bir alan (unknown_parameter); ya da 25 aktif anahtar zaten (too_many_keys).
429bu ilanı beğen Ağu 21 (rate_limit_exceededile 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 anahtarı okumak

GET https://nymbot.ai/api/v1/keys/{id} İmzalıyız

Geri Dönüş {"data": {…}} Anahtar nesne ile veya 404 key_not_found Eğer anahtarınızın bu kimliği yoksa.

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);

anahtarı değiştirmek

PATCH https://nymbot.ai/api/v1/keys/{id} İmzalıyız

Herhangi birini gönderin name, limit_sats, reset_period Ve expire_atAnahtar yaparken de aynı kurallara uymak gerekir. null Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme: Düzeltme (400 key_revoked) Geri Dönüş {"data": {…}} Güncellenmiş anahtar objektifi ile.

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);

anahtarı iptal etmek

DELETE https://nymbot.ai/api/v1/keys/{id} İmzalıyız

Anahtarı anında durdurur, iyi. listede kalır revoked_at ayarlanmıştır ve görülebilir include_revoked=trueİptal edilmiş bir anahtarı iptal etmek aynı şekilde yanıt verir. Sadece en yeni 50 iptal edilmiş anahtarlar saklanır; eski anahtarlar başka bir anahtar iptal edildiğinde silinir.

Cevap

{ "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 Hakkında

Bir Lightning cüzdanını Nostr Wallet Connect ile bağlayın ve API harcamaları düşük olduğunda Nymbot kendi başına bir denge üstlenir. Başvuru İmzalandı.

Nasıl çalışır: Bir API isteği izlemeyi seçtiğiniz bilançoya yüklenirken, eğer bu bilanço pragunuzun altında düşerse, Nymbot, top-up miktarınız için bir fatura yapar, cüzdanınıza ödeme yapmasını ister ve krediyi ekler. Her 5 dakikada bir kez üst üste yükselir, böylece taleplerin patlaması cüzdanı boşaltamaz. Uygulamalarda harcama onu tetiklemez. Son top-up ve son hatanın zamanı ve boyutu ayarlardadır; bir hata sonrası bir ödeme yapıldıysa, faturasını kontrol edin Top-up statüsü Onu da krediler.

Bir cüzdan bağlamadan önce

Bir bağlantı şeridi, tutan herkesin cüzdanınıza ödeme yapmasını isteyebilmesini sağlar. Nymbot şifreli depolar ve yalnızca kendi üst düzey faturalarını ödemek için kullanır, ancak cüzdanınızda bir harcama bütçesi var, böylece ödeme yapabileceği en fazla şey size seçilen bir sayıdır. cüzdan desteklenmelidir. pay_invoice.

Cüzdan bağlamak

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect İmzalıyız

alanıtürüİhtiyaçAçıklama
nwc_urlString içinEvetBağlantı hattı, başlangıç nostr+walletconnect://Nymbot cüzdan istedi get_info Önceki İçerikİzmir’de kurtarıldı, kurtarıldı
threshold_satsİnterneteEvetBu rakamlar düştüğünde bu rakamlar en az 1000’e düşer.
topup_satsİnterneteEvetHer seferinde ne kadar ekleyeceksiniz? 1000 ila 1.000.000 sats.
tierString içinHayırpro (Devamını Oku) veya standard: bakmak ve üst üste dengesi.

Cevap

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
statüsüNe zaman
400Bağlantı çubuğu (invalid_nwc_urlCevapla Cevabı iptal etme (nwc_unreachable) veya kontrolü reddetti (nwc_rejected); bağlantı faturaları ödemez (nwc_missing_permissionya da sınırların ötesinde bir miktar.
501Bu sayfa için otomatik top-up açılmıyor (nwc_unavailableAynı şey diğer iki son nokta için de geçerlidir.

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());

ayarları okumak

GET https://nymbot.ai/api/v1/nwc-auto-topup İmzalıyız

Aynı nesneyi bağlayarak, connected: false Diğer alanlar null Hiçbir cüzdan bağlanmadığında, bağlantı çubuğu kendisi asla iade edilmez.

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());

Bağlantısızlık

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection İmzalıyız

Saklanan bağlantı dizisini siliyor. Artık üst düzey oluşturulmaz. emin olmak için cüzdanınızdaki bağlantıyı da iptal edebilirsiniz.

Cevap

{ "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());

Anahtar olmadan ödeme

Düzenli fiyatlı son noktalar, Lightning üzerinden bir kerede tek bir talep için ödenebilir, anahtar, hesap ve denge olmadan: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations Ve POST /embeddingsSohbet, Cevaplar ve Mesajlar her zaman bir anahtar gerektirir. anahtar taşıyan bir talep normalde olduğu gibi bilançoya fatura edilir; ödeme akışı yalnızca anahtar gönderilmediğinde başlar.

Nymbot, aynı fikrin iki versiyonunu tek bir arka plandan konuşuyor: Lightning Labs L402 Hakkında Eski adıyla da kabul edilmiştir. LSAT) ve IETF Tasarımı Ödeme HTTP kimlik doğrulama programı lightning yöntem ve charge Müşterinizin anladığı her şeyi kullanın.

Kendi Serverinizi Çalıştırın

Anahtar olmadan ödeme sadece API_L402_SECRET en az 32 rastgele bayt, hex (64 karakter) veya base64 (44) olarak bulunur. openssl rand -hex 32Daha kısa veya tahmin edilebilir bir değer, özelliğini kapatır ve nedenini kaydeder. API_L402_SECRET_PREVIOUS Bir gün için: kimlik bilgileri, durum URL'leri ve bunun altında yapılan zorluklar, sona erene kadar çalışmaya devam eder.

meydan

Başvuru için Tıklayınız No Authorization header. eğer geçerli ise, hiçbir şey çalışmaz ve 402 Payment Required tam olarak ne talep maliyeti için bir fatura ile: bir anahtar ödeyecek aynı fiyat, standart bir kredi 10 sats veya 100 sats bir Pro kredi dönüştürüldü ve tam bir sat (en azından 1 sat, ve en azından 0.05 kredi minimum). WWW-Authenticate Aynı fatura için zorluklar:

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 }
}

Ödemeyi request Bazı parametreler base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Sonuçta bir zorluk var, sonuçta Content-Type (Medya türü ve, çok parçası için, sınırı) ve gönderdiğiniz tam vücut baytlarının SHA-256'ya, ve 15 dakika sürer. eşitlik Tekrar talep: Aynı Content-Type Çeşitli JSON baytları veya birçok bölümün son noktaları için (/images/edits, /audio/transcriptions, /audio/translationsÇoğu HTTP kütüphanesi, bir formun kodlandığı her zaman yeni bir sınır seçer, bu yüzden bir kez kodlayın ve bu baytları iki kez gönderin.

Her adres dakikada 30 meydan okuma isteyebilir (IPv6 adresi tam olarak /64 olarak sayılır). Bilinmeyen adresi olan talepler dakikada 10 daha sıkı paylaşır ve tüm adreslerde Nymbot sorunları üzerinde genel bir limit vardır; bir meydan okuma yapmadan önce reddedilen bir talep (örneğin, geçerli olmayan JSON ile) buna karşı sayılmaz. 429 ile Retry-AfterAnahtar veya yetkilendirme olmadan çağrılan ödenen son noktalara da adres başına dakikada 120 kimlik doğrulamayan isteğin genel sınırına kadar sayılır. Content-Type Yok değil application/json (veya multipart/form-data İptal Edildi (İptal Edildi) 415 Hiçbir zaman fatura alamazsınız.

Girişler, girişte bulunan tokenlerin bir tahmininden 1.5× marj ile fiyatlandırılır, çünkü gerçek sayısı ancak daha sonra bilinir. Token Geri Dönüşüm.

Ödemeyi Gönder

Herhangi bir Lightning cüzdan ile faturayı ödeyin. cüzdan size ön resim, 64 hex karakter verir. Sonra bunlardan biriyle aynı isteği gönderin:

Programıheader için
L402 HakkındaAuthorization: L402 <macaroon>:<preimage> (LSAT Aynı zamanda çalışıyor)
ÖdemeAuthorization: Payment <base64url JSON>JSON nerede bulunur {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Ödeme talebi anahtarla yapılan bir talebi tam olarak aynı şekilde yanıtlar, ancak nymbot Düzensizlik alanları bulunmamaktadır: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}ve var olmayan X-Nymbot-Balance-Sats Header: Payment Scheme ile ödenen bir talep aynı zamanda bir Payment-Receipt header (base64url JSON ile meydan oku id, ödeme hash olarak reference, status Ve timestampÖdeme talepleri herhangi bir nym'e bağlı değildir, bu nedenle sorguların geçmişinde görünmez.

statüsüNe zaman
402 payment_already_usedHer ödeme bir talep için ödenir. yanıt bu talep için yeni bir meydan okur, böylece bir müşteri son kimlik bilgilerini (örneğin lnget Yine tek tek ülke.
402 payment_mismatchSonuç olarak, başka bir nokta için sertifika verildi. Content-Type ya da vücut, ya da bu isteğin şimdi maliyetinden daha az ödeme. bu isteğe yeni bir meydan okuma gelir; eğer ödeme çok küçükse, ödediğiniz şey bir geri gelir Token Geri Dönüşüm (refund_token Ve refund_sats Vücudun içinde )
402 payment_expired15 dakikadan fazla bir süre geçti. yeni bir meydan okuma ile birlikte geliyor. ön resim ödediğinizi gösteriyorsa, ödediğiniz şey bir ödeme olarak geri gelir. Token Geri Dönüşüm (refund_token Ve refund_sats Bir kere, bir kere, bir kere, bir kere, bir kere, bir kere, bir kere, bir kere, bir kere, bir kere, bir kere.
401 invalid_preimageÖn resim faturanın ödeme hash'ine hash yapmaz. ödeme kullanılmaz.
401 invalid_payment_credentialİletişim bilgileri yanlış biçimlendirildi, Nymbot tarafından yayınlandıktan sonra değiştirildi veya ödeme hash isimleri Nymbot hiçbir zaman faturayı yayınlamadı.
429 rate_limit_exceededBir dakikada bu adresten gelen 30'dan fazla kimlik veya anahtarı doğrulamayan veya bir dakika içinde 60'dan fazla kez gönderilen bir iade işareti. 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üşteriler inşaat mppx Bir Yıldırım yöntemi ile ödeme meydanını kendileri ele alırlar; onları son noktaya yönlendirir ve ödeme yapmalarına izin verirler.

Videoları

Ücretli POST /videos cevaplar 202 Bir tanesi bir tanesi bir tanesi bir tanesi a status_url: GET İşe uymak için herhangi bir anahtar olmadan imzalanır ve işe tutulduğu sürece 24 saat boyunca çalışı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..."
  }
}

Kaldı ki refund_token bu cevaptan: sadece burada gösterilir. videonun geri dönüştürülmesi sırasında boştur (GET /api/v1/l402/refunds cevaplar "status": "pending"); eğer geri dönüşü faturalandırılmamışsa, ödeme oraya yerleşir. refund_sats Geri ödenmiş bir iş için ama asla token, bu yüzden durum URL'sini paylaşmak geri ödemeyi paylaşmaz.

Geri Ödeme

Ücretli bir talep başarısız olursa ve sağlayıcı deneme için Nymbot'ı faturalandırırsa, ödeme saklanır ve hata böyle diyor, charged_satsBaşka bir soru işaretlenmişse, yanlış bir soru işaretlenmişse, Token Geri Dönüşüm Ödediğiniz ücretin değeri:

{
  "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"
  }
}

Kullanılmamış parçalar aynı şekilde geri döner: iki resim isterseniz ve bir tanesi faturalandırılmamışsa, başarı cevabı nymbot nesne, eksik olan için bir iade token taşıyor; uzunluğu okunamayan bir transkripsiyon, dosyanın olabildiğince uzun olması için fiyatlandırılır (asla 30 dakikadan fazla) ve gerçek uzunluğa olan fark bir iade token olarak geri döner; eğer 30 dakikadan uzun olduğu ortaya çıkarsa, reddedilir. 413 Ve tüm ödeme geri gelir.Girişler tahmini tuttuğu şeyi iade eder.Başarısız bir video, gönderisinin iade edildiği tokene iade eder.

Bir iade işareti rastgele bir 256-bit koddur. Nymbot sadece hash'ini depolar ve 30 gün sonra sona erer.

  • ile ödeme yapın. Gönder Authorization: Bearer REFUND-… Aşağıdakilerden hangisidir?Aşağıdakilerden hangisidir?Aşağıdakilerden hangisidir?Aşağıdakilerden hangisidir?Aşağıdakilerden hangisidir?Aşağıdakilerden hangisidir?Aşağıdakilerden hangisidir?refund_token_sats İçinde nymbot Bir token, talep cevaplarından daha az değerlidir. 402 refund_insufficient· Bir hesaplanmamış başarısızlık, sats'ı aynı token üzerinde geri koyar.
  • Bunu kontrol edin. GET /api/v1/l402/refunds Aynı header ile geri döner {"sats": 237, "status": "open", "expires_at": "..."}.
  • Bir token dakikada en fazla 60 kez kullanılabilir.
  • Onu bir nym’e çevirin. onu içine koyun Bir hediye alın Nymbot uygulamasında veya çağrı POST /api/v1/l402/refunds/redeem ile a Başvuru İmzalandı Ve {"refund_token": "REFUND-...", "balance": "standard"} (veya "pro"Tüm krediler bilançoya gidiyor (10 sats her standartta, 100 Pro'da); API istekleri için token üzerinde tam bir kredi kalmamak için sats.

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"

Cevap

{ "data": { "credited": 23, "tier": "standard", "balance_credits": 123, "remaining_sats": 7 } }