Перайсці да зместу
Назад у Nymbot

База ведаў распрацоўшчыкі

Баланс, топ-ups і ключы

Праверыць, што ў вас ёсць, надрукаваць Lightning, надрукаваць аўтаматычна з вашага уласнага кошачка, паглядзець, што кошт кожнага патрабавання, і кіраваць ключамі з кода.

Праверка балансу

Як вашы балансы, і як шмат з капусты гэтага ключа выкарыстоўваецца.

GET https://nymbot.ai/api/v1/credits/balance — Вам патрэбны ключ API. POST Працуе і для тых, хто гэта чакае.

balance з'яўляецца два балансы разам у доларах па цяперашняй цэне Bitcoin, для інструментаў, якія чакаюць адну колькасць (null (Рэгістратар - гэта проста кампанія, праз якую вы можаце зарэгістраваць сваё даменнае імя ў абмен на штогадовую плату.) key — Вы кажаце, што мозг забывае тое, што яму непатрэбна.

адказ

{
  "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"
  }
}
СтатусКалі
401Ключ знік, невядомы, адменены або выконваецца.

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

Способы выплаты

Узнікае пытанне: калі іх ведае увесь свет, ці можна назваць іх няўдачнікамі?

GET https://nymbot.ai/api/v1/topup/payment-methods Ключа не патрэбны.

А top-up з'яўляецца 10 да 1 000 000 sats; Pro top-up павінна купіць не менш за адзін Pro-крэдыт, так што ён пачынаецца з 100 sats. bulk_bonus вылічвае дадатковы крэдыт на большых топ-упаў, такі ж, як у прыкладзе: 10%, 15% або 20% больш на стандартных топ-упаў з 500, 1000 або 5000 sats, і на Pro топ-упаў з 5,000, 10,000 або 50,000 sats.

адказ

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

Вынікі пошуку - top over lightning

Запрашаем усіх, хто цікавіцца беларускай гісторыяй, наведаць нашу Бібліятэку. Праверыць гэта Для таго, каб атрымаць крэдыт.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning — Вам патрэбны ключ API.

ПолеТыппатрабаванаОпис
amountнумартакЯк шмат, на currencyУсяго за кошт закупкі.
currencyСтрынгНеSATS (У тым жа выпадку, USD або BTCДолары канвертуюцца па цяперашняй цэне Bitcoin.
tierСтрынгНеpro (Пасля перамогі) або standard• у якім становішчы знаходзіцца крэдыт.

Стандартны крэдыт 10 sats і Pro крэдыт 100 sats, плюс любы буйны бонус; credits Кажуць, што гэта дае дадатковае значэнне.

адказ

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
СтатусКалі
400Іншы шлях у шляху (unsupported_method), невядомая валюта (unsupported_currency(або звыш, або звыш, або звыш, або звыш, або звыш, або звыш, або звыш)amount_too_small), больш за 1 000 000 sats (amount_too_large) або адказаў на Lightning портфель (amount_out_of_range).
429Больш за 60 рахункаў для гэтага німа, або 120 з гэтай адрасы, за гадзіну (rate_limit_exceededІ з Retry-After).
502Не магу сказаць, што ўжо вельмі засмучаная.)invoice_unavailableІ з 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

Пытанне: Ці можа пасажыр трапіць у Кітай у міжнародным аэрапорце Гуанчжоу Байюнь, а потым пакінуць Xinumx на ўсходнім чыгуначным вакзале? creditedТрэба звярнуць увагу на тое, што для свідравін выкарыстоўваюць больш магутныя – свідравіны помпы, а для калодзежаў – погружные.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — трэба ключ з нім, які зрабіў рахунак.

status І pending (Ніколі не заплаціў за гэта) paid (Плаціць, але не зарэгістравана; праверыць яшчэ раз), credited (На вашым рахунку) або expired (Ніякіх падставаў для грамадскіх хваляванняў ці рэнесансу) — гэта рэнесанс, які мы прапануем.

адказ

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
СтатусКалі
400Ідэнт не з'яўляецца 64-значным ідэнтам з выкліку стварэння.
404Ніякіх звестак пра тое, што вы не ведаеце (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);

Хочаш гісторыю

Адзін рад на запыт: што гэта было, якая мадэль, колькі токенаў і што гэта коштала. Нікакіх памочнікаў або адказаў не захоўваюцца, так што ніякіх не вяртаюцца. Рады захоўваюцца на 90 дзён, найноўшы першы.

GET https://nymbot.ai/api/v1/queries/history — патрэбны ключ API, які бачыць свае запрашэнні, або Заяву падпісаў З вашага німа, які бачыць кожны ключ.

ПолеТыппатрабаванаОпис
pageАсноўны артыкул (query)НеПадрабязнасці 1 — не больш за 1000; верхняя старонка 400 invalid_value.
page_countАсноўны артыкул (query)НеПадрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней: Падрабязней:
start_date
end_date
Сцягнуць (QueryНеISO 8601 Дата і час.
modelСцягнуць (QueryНеТолькі гэтая мадэль.
typeСцягнуць (QueryНеchat, responses, messages, image, video, speech, transcription або embedding.
all_keysБульбэра (англ.: Boolean Query)НеІ ў ключы: true У кожнай з іх з'явіліся новыя кватэры, кватэры, джынсы. false.
key_idСцягнуць (QueryНеЗаявы і абмоўкі пра абмежаванне адказнасці all_keys=trueТолькі гэта ключ.

адказ

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

Заявы на рахункі

Стварэнне, змяненне і аднаўленне клавіш, агляд рахункаў і аўтаматычныя топ-ups не прымаюць клавіш API. Яны прымаюць падпіс ад вашага німа, так што прапушчаны клавіш можа траціць да яго капусты, але ніколі не можа зрабіць іншы клавіш або павысіць свой уласны капусты.

Аппарат робіць гэта для вас: усё ў яго Пажар Усё, што вам трэба зрабіць, гэта проста адзначце файлы, і вы ўсё бяспечна.

Падпісанне з'яўляецца падзеяй Nostr тыпу 27235 (NIP-98), накіраванай base64 у Authorization Header з словам Nostr На першым месцы:

Гэтая падзея

{
  "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 Усё, што вы чулі пра карысць пара раней - усяго толькі чуткі і павер'і.
  • method Гэта HTTP метод.
  • payload Гэта SHA-256 групы сыравага патрабавання, у гекса. POST і PATCHУсё, што вы робіце, — гэта тое, што вы робіце, — гэта тое, што вы робіце.
  • created_at Працягласць работы паслугі складае 60 секунд ад часу сервера.
  • Кожнае выданне працуе раз, а GET Усё, што вы чулі пра карысць пара раней - усяго толькі чуткі і павер'і. nonce Усяго за дзень можна выпіць 1 літр соку без уліку колькасці вады.
  • Тэмпература ў гэтай (малюпасенькай!) кропцы дасягае дзесяткаў тысяч градусаў, хоць у любым іншым месцы цела тэрмометр пакажа норму. Content-Type: application/json.

Вынікі пошуку - missing event returns 401 missing_nostr_auth— тое, што няправільна сфарміравана, няправільна падпісана, занадта старая, або для іншага URL, метаду або цела вяртае invalid_nostr_authНаступным крокам з'яўляецца выбар адпаведнага абсталявання для nostr_auth_replayedПадпіс прачытаецца, перш чым цела будзе прачытана, і кожны адрас можа няправільна прачытаць яго 30 раз у хвіліну (адрас IPv6 лічыцца як яго ўвесь /64); пасля таго ён атрымае 429 з Retry-After.

Папярэдні Тэкст Наступны Тэкст Наступны Тэкст Наступны Тэкст Наступны Тэкст Наступны Тэкст (https://nymbot.ai, https://nymchat.app Паводле інфармацыі, прадстаўленай камандай навуковых работнікаў, барацьба з інфекцыйнымі хваробамі штогод становіцца прычынай смерці тысяч людзей з усяго свету. OriginІ на іх не ўплываюць.

Вашы тайныя ключы

Для падпісання патрэбны тайны ключ вашага німа (The Secret Key) nsecТрэба ў такім, здавалася б, «простым» і «даступным» знайсці сваё, індывідуальнае бачанне прыроды і зрабіць яго блізкім сэрцу гледача.

Гэтыя дапаможнікі складаюць заголоўку. Пазнейшыя прыклады на гэтай старонцы выкарыстоўваюць іх. Яны чытаюць тайны ключ у галіне з NOSTR_SECRET_HEXАдзін з прыкладаў, які выкарыстоўваецца Нашы паслугі, якія выкарыстоўваюць клавішу nsec або hex, і sha256sum на максімальнасці, 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");
}

Сумленнасць рахункаў

Што паказвае ліст API прыкладання ў верхняй частцы: ваш публічны ключ, два балансы, колькі клавіш актыўныя (не адменены або не выконваліся), і Аўтаматычны top-up Настаўнікі або null Калі сервер не дае іх.

GET https://nymbot.ai/api/v1/account Нужна а Заяву падпісаў.

адказ

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

Упраўленне ключамі

У кожнай з іх без выключэння плануецца замена вокнаў на вокны ПВХ. Заяву падпісаўКожны ключ вяртаецца ў такой форме, з часам у ISO 8601 і сумамі ў sats:

Ключавы аб'ект

{
  "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 Маўляў, ізноў размаўляем пра заканадаўства, а пра тое, што хвалюе людзей — нічога.

Ключавыя лісты

GET https://nymbot.ai/api/v1/keys І падпісаў.

ПолеТыппатрабаванаОпис
include_revokedБульбэра (англ.: Boolean Query)НеУваход у прафесію быў простым: у 1996 годзе не было нават таксометра. false.

адказ

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

Стварэнне ключа

POST https://nymbot.ai/api/v1/keys Вынікі пошуку - back 201.

ПолеТыппатрабаванаОпис
nameСтрынгтак1 да 40 знакаў, якія адрозніваюцца ад вашых іншых активных клавіш (ігноруючы прыклад).
limit_satsІнтэрнэтНеУ гэтым выпадку адказнасць за абмежаванне адказнасці — не менш за 1.
reset_periodСтрынгНеdaily, weekly або monthlyНяхай limit_satsЗаставайце гэта для капелюха, які ніколі не рэстайлізуецца.
expire_atString або integerНеКалі ключ перастае працаваць: час ISO 8601, або мілісекунды з 1970 года.

Працягласць (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"
  }
}
СтатусКалі
400Праблема ў тым, што добрыя матывы не заўсёды добрыя справы.duplicate_name); капуста, якая не з'яўляецца цэлым лікам не менш за 1; перыяд рэстаўрацыі без капусты; выпадак у мінулым; невядомае поле (unknown_parameter); або 25 актыўных клавіш ужо (too_many_keys).
429Больш за 60 ключоў, зробленых гэтымі німамі, або 120 з гэтай адрасы, за гадзіну (rate_limit_exceededІ з 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);

Чытаць 1 ключ

GET https://nymbot.ai/api/v1/keys/{id} І падпісаў.

вяртаюцца {"data": {…}} з ключавым аб'ектам, або 404 key_not_found Калі ў вас няма такога ключа.

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

Змяняць ключ

PATCH https://nymbot.ai/api/v1/keys/{id} І падпісаў.

Запрашаем усіх name, limit_sats, reset_period і expire_atТакія ж правілы, як і пры выкананні ключа. null У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (400 key_revoked) вяртаецца {"data": {…}} Актуальныя ключавыя аб'екты

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

Сцягнуць ключ

DELETE https://nymbot.ai/api/v1/keys/{id} І падпісаў.

У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал. revoked_at Здаровая касметыка вы можаце зрабіць самі include_revoked=true«Аналіз паказаў, што выдатак кармавых адзінак на 1 кг прыбаўлення на старых комплексах значна перавышае гэтае значэнне на новых.

адказ

{ "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 прадукцыя

Падключыце грошы Lightning з Nostr Wallet Connect і Nymbot выконвае баланс сам па сабе, калі расход API запускае яго нізкі. Заяву падпісаў.

Як гэта працуе: пасля таго, як запыт API налічваецца на баланс, які вы выбралі, каб паглядзець, калі гэты баланс упаў пад ваш пагроз, Nymbot робіць рахунак за вашу суму, запрашае ваш гандлёвы кошт, каб заплаціць яго, і дае крэдыт. Ён налічвае больш за адзін раз кожныя 5 хвілін для кожнага німа і баланс, так што выбух запытаў не можа вытрымаць гандлёвы кошт. Выдаткі ў прыкладаннях не выклікаюць яго. Час і памер апошняга пакрыцця, і апошняя няправільнасць, знаходзяцца ў параметрах; калі выплата пайшла праз пасля няправільнасці, праверкаваць яго рахунак з Статыстыка top-up Крэдыт гэта

Перш чым звязаць портфель

Nymbot захоўвае яго зашифрована і толькі калі выкарыстоўвае яго, каб заплаціць свае ўласны рахункі, але зрабіць злучэнне толькі для гэтага, з расходам бюджэт у вашым кошельцы, так што найбольш ён можа калі-небудзь заплаціць з'яўляецца нумар выбраў вас. pay_invoice.

Сцягнуць портфель

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect І падпісаў.

ПолеТыппатрабаванаОпис
nwc_urlСтрынгтакСцяг, які пачынаецца nostr+walletconnect://Nymbot запрашае кошелек для get_info Перш за ўсё, вы можаце спампаваць яго і захоўваць яго зашифрована.
threshold_satsІнтэрнэттакЗ тых часоў мінула больш за тысячу гадоў, што дасягнула такога ўзроўню.
topup_satsІнтэрнэттакКолькі грошай выдаткаваць кожны раз? 1000 да 1000 000 sats.
tierСтрынгНеpro (Пасля перамогі) або standardАбаланс, каб паглядзець і паверхні.

адказ

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
СтатусКалі
400не з'яўляецца выключэннем (invalid_nwc_url); кошелек не адказваў на свой рэлей (nwc_unreachable) або адказаў на чэк (nwc_rejected); сувязь не можа плаціць рахункі (nwc_missing_permission(або ў любым выпадку за межы дзяржавы).
501У гэтым выпадку адмысловы працэс не вызначаецца (nwc_unavailableТое ж самае адбылося і з іншымі двума пунктамі.

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

Чытаць настройкі

GET https://nymbot.ai/api/v1/nwc-auto-topup І падпісаў.

Наступным крокам з'яўляецца выбар адпаведнага абсталявання для connected: false І іншыя поля null Але, не зважаючы на непрацяглы час работы, змагла палюбіць сваю новую прафесію.

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

Выключэнне

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection І падпісаў.

Усё, што вам трэба зрабіць, гэта проста адзначце файлы, і вы ўсё бяспечна.

адказ

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

Плаціць на заказ без ключа

Крайні пункты фіксаванай ціны могуць быць аплачаны за адзін запыт у той час на працягу Lightning, без ключа, без рахунку і без балансу: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations і POST /embeddingsТрэба звярнуць увагу на тое, што для свідравін выкарыстоўваюць больш магутныя – свідравіны помпы, а для калодзежаў – погружные.

Nymbot размаўляе з двума версіямі той жа ідэі, з аднаго бакэнду: Lightning Labs' Ірландыя 402 (Таксама прымаецца пад сваёй старой назовай, LSAT) і зацверджаны IETF плаціць HTTP-аўтэнтыфікацыя з дапамогай lightning Методы і charge Усё, што вы робіце, разумее ваш кліент.

Загрузіць свой сервер

Плаціць без ключа ўключае толькі калі API_L402_SECRET змяшчае не менш за 32 выпадковыя байты, як гакс (64 знака) або base64 (44). openssl rand -hex 32Укладайце больш ва ўласную журналістыку, СМІ і змагайцеся за свабоду слова. API_L402_SECRET_PREVIOUS Усяго за дзень можна выпіць 1 літр соку без уліку колькасці вады.

Выклік

Напішыце заяўку без Authorization Калі гэта будзе правільна, нічога не працуе, і вы атрымаеце 402 Payment Required з рахункам на тое, што гэта запыт коштаў: той жа кошт, які ключ будзе плаціць, канвертаваны ў 10 sats стандартны крэдыт або 100 sats Pro крэдыт і закруглены да цэлага сата (не менш 1 sat, і не менш 0,05 крэдыт мінімальны). WWW-Authenticate Наступныя задачы за той жа рахунак:

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

плаціць request Параметр base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал. Content-Type (з'яўляецца тыпу медыя і, для многіх частак, яго межы) і на SHA-256 дакладнага цела байт вы адправілі, і доўжыцца 15 хвілін. Ідентичны Другая заява: тое ж самае Content-Type і тыя ж JSON-байты, або для многіх частковых канчатковых пунктаў (/images/edits, /audio/transcriptions, /audio/translationsБольшасць бібліятэк HTTP выбіраюць новы межы кожны раз, калі яны кодыруюць форму, так што кодыруюць яго адзін раз і адпраўляюць гэтыя байты два разы.

Кожны адрас можа запытаць за 30 выклікаў у хвіліну (аддзел IPv6 лічыцца цілым /64). Запыты, у якіх адрас не вядомы, падзяляюць строгі 10 у хвіліну, і ёсць агульная марка на выклікі Nymbot праблем на ўсіх адрасах; запыт адмовіўся, перш чым выклікаецца (напрыклад, з целам, які не важны JSON) не лічыцца да яго. 429 з Retry-AfterДадатковыя функцыі ўключаюць у сябе джакузі для поўнай рэлаксацыі і камінам, каб трымаць вас у цяпле і сытна. Content-Type І не application/json (або multipart/form-data Наступным крокам з'яўляецца выбар адпаведнага абсталявання для 415 І ніколі не атрымае рахунку.

Убудовы працэнтуюцца з ацэнкі токенаў у ўвазе, з маржэнам 1.5 раз, бо рэальны кошт вядома толькі пазней. Загрузіць Токен.

Запрашаем плаціць

Заплаціць рахунак з любым Lightning кошелек. Кошелек дае вам праізгляд, 64 гексавыя знакі. Затым накіраваць той жа запыт з адным з гэтых:

СхемаХідэр
Ірландыя 402Authorization: L402 <macaroon>:<preimage> (LSAT Працуе таксама
плаціцьAuthorization: Payment <base64url JSON>Дзе знаходзіцца JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Платны запыт адказвае менавіта так, як і той, які зроблены з ключом, акрамя таго, што nymbot Аб'ект не мае полей балансу: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}І там няма X-Nymbot-Balance-Sats у касу суб'екта валютных аперацый; Payment-Receipt Header (base64url JSON з ідэнтам выкліку, хаш-плацеж як reference, status і timestamp«Не разлічвайце, што мы будзем купляць за валюту ўгнаенні.

СтатусКалі
402 payment_already_usedВось што ён сам пісаў пра сваё стаўленне да выяўленчага мастацтва: “Артистические произведения доставляли мне всегда большое наслаждение, особенно живописные. lnget Тое ж самае і зноў пачынаецца.
402 payment_mismatchНаступным крокам з'яўляецца выбар адпаведнага абсталявання для Content-Type або цела, або плаціць менш, чым гэта патрабаванне зараз коштаў. Новы выклік для гэтага патрабавання прыходзіць з ім; калі выплата была занадта малая, тое, што вы заплацілі, вяртаецца як Загрузіць Токен (refund_token і refund_sats у сваім цела)
402 payment_expiredКалі вы не зрабілі план, каб выканаць план продажаў з самага пачатку месяца, але, як чакаецца, перапынак куш на выпадковых буйных здзелках - вы ўсё няўстойліва. Загрузіць Токен (refund_token і refund_sats Наступным крокам з'яўляецца выбар адпаведнага абсталявання для
401 invalid_preimageУ гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал.
401 invalid_payment_credentialКрэдытнасць зламаная, была зменена пасля Nymbot выдалі яго, або імёны плацежнага хаша Nymbot ніколі не выдаліў рахунак для.
429 rate_limit_exceededБольш за 30 акрэдытацый або ключоў, якія не праверылі, прыйшлі з гэтай адрасы за хвіліну, або адзін токен вяртання быў накіраваны больш за 60 разоў за хвіліну. 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"));

Кліенты заснаваны на mppx З дапамогай метаду Lightning справядлівыя самі плацежныя выклікі; паказаць іх на канчатковым пункце і пакінуць іх плаціць.

Відэа

А плаціць POST /videos адказаў 202 Як з’явяцца і іншыя, плюс а status_url: GET Усё, што вы чулі пра карысць пара раней - усяго толькі чуткі і павер'і.

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

Дай мне refund_token У гэтым выпадку адказнасць за выключэньне (GET /api/v1/l402/refunds адказаў "status": "pending"— Калі вы не паспееце, то вы будзеце плаціць за гэта, — сказаў Лукашэнка. refund_sats Для завяршанай працы, але ніколі токена, так што распаўсюджванне статуса URL не падзяліцца на возврат.

Загрузіць

Калі плацены запыт не спрацуе, і пастаўшчык зарабіў Nymbot за спробу, выплата захоўваецца і няправільнасць кажа так, з charged_satsЯк мы ўсе ведаем, што гэта немагчыма прадухіліць працэс старэння, ні назад часу. Загрузіць Токен Што варта заплаціць:

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

Незнойдзеныя часткі вяртаюцца ў той жа момант: калі вы запрасілі два малюнкі, а адзін з іх не аплаціў, удача nymbot аб'ект носіць токен вяртання для непаўторнага; транскрыпцыя, працягласць якой не можа быць прачытана наперад, цінуецца за самае доўгае, што файл можа быць (ніколі больш за 30 хвілін), і розніца з рэальнай даўжынёй вяртаецца як токен вяртання; калі выглядае, што больш за 30 хвілін, яна адмовіцца з 413 У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал.

Токен для вяртання грошай з'яўляецца 256-бітным кодам. Nymbot захоўвае толькі яго хаш, і ён выпадае пасля 30 дзён. Ён захоўвае сат балансу, і вы можаце:

  • Плаціце з ёй. Сцягнуць Authorization: Bearer REFUND-… Наступным крокам з'яўляецца выбар адпаведнага абсталявання для сацыялістычнай адказнасці (refund_token_sats У на nymbot У гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал. 402 refund_insufficientУ гэтым выпадку пешаходы, якія сканчаюць пераход, уяўляюць істотную небяспеку (мал.
  • Праверыць гэта GET /api/v1/l402/refunds У той жа час вернемся да {"sats": 237, "status": "open", "expires_at": "..."}.
  • Можна выкарыстоўваць адзін токен не больш за 60 раз у хвіліну.
  • Змясціце гэта ў німецкім. Загрузіце гэта ў Запрашаем дадаць дар у прыкладзе Nymbot, або выклікаць POST /api/v1/l402/refunds/redeem З а Заяву падпісаў і {"refund_token": "REFUND-...", "balance": "standard"} (або "pro"Усе крэдыты ідуць у баланс (10 sats кожны на стандарт, 100 на Pro); sats, якія не робяць цэлы крэдыт застацца на токене для запытаў 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"

адказ

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