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.
Bu sayfa kolaylık sağlamak amacıyla makine tarafından çevrilmiştir. İngilizce orijinali geçerli olan versiyondur.
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 |
|---|---|
401 | Anahtar 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 |
|---|---|---|---|
amount | Numarası | Evet | Ne kadar, ne kadar currencySatı için tam bir sayı. |
currency | String için | Hayır | SATS (Düzenleme için tıklayın) USD veya BTCDolarlar geçerli Bitcoin fiyatına dönüştürülür. |
tier | String için | Hayır | pro (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 |
|---|---|
400 | Yü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). |
429 | bu 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 |
|---|---|
400 | ID, oluşturulan çağrıyı oluşturan 64 karakterli id değildir. |
404 | bu 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ır | Varsayılan 1, en fazla 1000; daha yüksek bir sayfa 400 invalid_value. |
page_count | Çözüm (Query) | Hayır | Sayfa başına satırlar. Varsayılan 20, en fazla 100. |
start_dateend_date | String Hakkında (Query) | Hayır | ISO 8601 tarihleri ve saatleri |
model | String Hakkında (Query) | Hayır | Sadece bu model. |
type | String Hakkında (Query) | Hayır | chat, responses, messages, image, video, speech, transcription veya embedding. |
all_keys | Boolean (Çözümlü Çözüm) | Hayır | Bir anahtar ile : true Aynı anahtarın her anahtarını içerir.Default false. |
key_id | String Hakkında (Query) | Hayır | Belirli 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": "..."
}
uis 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.methodHTTP yöntemi kullanılır.payloadSHA-256'nın hexadeciminde, ham isteği vücudunun SHA-256'sıdır.POSTVePATCHGönderdiğiniz içeriğin içeriği ise, gönderdiğiniz içeriğin içeriğidir.created_atSunucu saatinin 60 saniye içinde olması gerekir.- Her etkinlik bir kez, a
GETKapatılan bir başlık tekrar oynanamaz. Her isteğe yeni bir başlık yazın.nonceAynı 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.
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_revoked | Boolean (Çözümlü Çözüm) | Hayır | Anahtarları 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 |
|---|---|---|---|
name | String için | Evet | 1 ila 40 karakter, diğer aktif anahtarlarınızdan farklıdır (bu durumun göz ardı edilmesi). |
limit_sats | İnternete | Hayır | En azından 1’e kadar harcama kapısı, kapı dışında bırakın. |
reset_period | String için | Hayır | daily, weekly veya monthlyİhtiyaçları limit_satsAsla geri yüklemeyen bir kap için bırakın. |
expire_at | String veya integer | Hayır | Anahtar ç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 |
|---|---|
400 | Kayı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). |
429 | bu 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 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_url | String için | Evet | Bağlantı hattı, başlangıç nostr+walletconnect://Nymbot cüzdan istedi get_info Önceki İçerikİzmir’de kurtarıldı, kurtarıldı |
threshold_sats | İnternete | Evet | Bu rakamlar düştüğünde bu rakamlar en az 1000’e düşer. |
topup_sats | İnternete | Evet | Her seferinde ne kadar ekleyeceksiniz? 1000 ila 1.000.000 sats. |
tier | String için | Hayır | pro (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 |
|---|---|
400 | Bağ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. |
501 | Bu 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.
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ında | Authorization: L402 <macaroon>:<preimage> (LSAT Aynı zamanda çalışıyor) |
| Ödeme | Authorization: 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_used | Her ö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_mismatch | Sonuç 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_expired | 15 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_exceeded | Bir 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İçindenymbotBir token, talep cevaplarından daha az değerlidir.402refund_insufficient· Bir hesaplanmamış başarısızlık, sats'ı aynı token üzerinde geri koyar. - Bunu kontrol edin.
GET /api/v1/l402/refundsAynı 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/redeemile 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 } }