Liikuge sisu juurde
Tagasi Nymboti juurde

Teadmistebaas Arendajad

Tasakaal, top-ups ja võtmed

Kontrollige, mis teil on, ületage Lightning, ületage automaatselt oma rahakotist, vaadake, kui palju iga taotlus maksab, ja hallake võtmeid koodist.

Kontrollige tasakaalu

Mõlemad teie tasakaalud ja kui palju selle võtme kappi kasutatakse.

GET https://nymbot.ai/api/v1/credits/balance Vaja on tulekahju võtmet. POST See töötab ka klientidele, kes seda ootavad.

balance on kaks tasakaalu koos dollarites praeguse Bitcoini hinnaga, tööriistade jaoks, mis ootavad ühte numbrit (null Ülejäänud on krediitides ja satsis, mis on see, kuidas tasakaalu tegelikult hoitakse. key Kirjeldab küsitavat võtmet.Kõne, mis on saavutanud oma piiri, saab ikka kontrollida tasakaalu.

vastus

{
  "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"
  }
}
staatuseMillal
401Võti on kadunud, tundmatu, tühistatud või aegunud.

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

Makseviisid

Kuidas saate top up, ja piirid. välk on ainus meetod.

GET https://nymbot.ai/api/v1/topup/payment-methods Ei ole vaja võtmeid.

Top-up on 10 kuni 1 000 000 sats; Pro top-up peab ostma vähemalt ühe Pro krediidi, nii et see algab 100 sats. bulk_bonus loetleb täiendava krediidi suuremate top-ups, sama nagu rakenduses: 10%, 15% või 20% rohkem standard top-ups alates 500, 1000 või 5000 sats ja Pro top-ups alates 5000, 10,000 või 50,000 sats.

vastus

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

Tõuseb üle Lightning

Teeb Lightning arve, mis lisab krediiti nym võtme kuulub. maksta seda iga Lightning rahakott, siis Kontrolli seda Selleks, et krediit oleks lisatud.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning Vaja on tulekahju võtmet.

väljadtüüpiNõutavKirjeldus
amountnumbriJahKui palju, kui palju currencyTäielik arv tasu eest.
currencyStringidEi oleSATS (Kõik need defektid on USD või BTCDollarid konverteeritakse praeguse Bitcoini hinnaga.
tierStringidEi olepro (default) või standard• millisele tasakaalule krediit läheb.

Standardkrediit on 10 sats ja Pro krediit 100 sats, pluss mis tahes massboonus; credits ütleb, mida see arve lisab.

vastus

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
staatuseMillal
400Teine meetod teel (unsupported_method) tundmatu valuuta (unsupported_currency(või minimaalne summa, mis jääb puudu, või minimaalne summa, mis jääb alla minimaalse summa)amount_too_smallÜle 1 000 000 (amount_too_large) või keeldunud Lightning rahakoti (amount_out_of_range).
429Üle 60 arve selle nimme või 120 selle aadressi kohta tunnis (rate_limit_exceededja koos Retry-After).
502Praegu ei saa arveid teha (invoice_unavailableja koos 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);

Ülevaade top-up

Küsib, kas arve on tasutud ja kui see on, lisab krediidi. creditedKontrollimine uuesti pärast seda on ohutu: krediit maandub üks kord, ükskõik kui palju kordi te küsite.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - vajab võtme nimelt, mis arvet tegi.

status on pending (seda ei ole veel makstud) paid (maksetud, kuid ei ole veel krediteeritud; kontrollige uuesti), credited (teie tasakaalust) või expired (ei maksa õigeaegselt). tasakaalu väljad on tasemel, kus arve ületab.

vastus

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
staatuseMillal
400ID ei ole loodud kõne 64-tunnine ID.
404Ei ole arvet selle ID-ga teie nimme jaoks (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);

Tahad ajalugu

Üks rida taotluse kohta: mis see oli, milline mudel, mitu tokenit ja mis see maksab. Ühtegi juhendit või vastust ei säilita, nii et ühtegi ei tagastata. Riiulid säilitatakse 90 päeva, uusim kõigepealt.

GET https://nymbot.ai/api/v1/queries/history — vajab API võtmet, mis näeb oma taotlusi, või allkirjastatud taotlus Nime, kes näeb iga võtit.

väljadtüüpiNõutavKirjeldus
pageIntegreeritud küsimus (query)Ei oleVaikimisi 1, maksimaalselt 1000; kõrgem lehekülg on 400 invalid_value.
page_countIntegreeritud küsimus (query)Ei oleReeglid lehekülje kohta. vaikimisi 20, maksimaalselt 100.
start_date
end_date
String (või küsimus)Ei oleISO 8601 kuupäevad ja kellaajad.
modelString (või küsimus)Ei oleAinult see mudel.
typeString (või küsimus)Ei olechat, responses, messages, image, video, speech, transcription või embedding.
all_keysBoolean (või küsimus)Ei oleÜks võti on: true sisaldab kõiki sama nym.Default võtmeid false.
key_idString (või küsimus)Ei oleallkirjastatud taotlusega või all_keys=trueAinult see võti.

vastus

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

Konto allkirjastamise taotlused

Rakendamine, muutmine ja tühistamine võtmed, konto kokkuvõte ja automaatne top-ups ei võta API võtme. nad võtavad allkirja oma nym, nii lekkinud võtme võib kulutada kuni oma kappi, kuid ei saa kunagi teha teise võtme või tõsta oma kappi.

Rakendus teeb seda teie jaoks: kõik oma Tulekahju See osa on vajalik ainult selleks, et hallata oma koodi võtmeid.

Allkiri on Nostri sündmus tüüpi 27235 (NIP-98), mis saadetakse base64-kooditud Authorization Header koos sõnaga Nostr ja eespool:

Üritus

{
  "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 on taotluse täielik URL, mis sisaldab päringute stringit, täpselt nii nagu see on saadetud.
  • method See on HTTP meetod.
  • payload on tooraine taotluse keha SHA-256 hex. POST ja PATCH, ja keha, mida sa saadad, peab olema byte byte, mida sa hashed.
  • created_at See peab olema serveri kella 60 sekundi jooksul.
  • Iga sündmus toimib üks kord, a GET lisatud, nii et salvestatud pealkirja ei saa uuesti mängida. Kirjutage iga taotluse jaoks uus pealkirja. nonce märgistada juhusliku väärtusega, nii et samal sekundil allkirjastatud kaks taotlust on endiselt erinevad.
  • Allkirjastatud taotluse keha võib olla maksimaalselt 64 KB ja keha vajab Content-Type: application/json.

Kadunud sündmus naaseb 401 missing_nostr_auth; üks, mis on halvasti moodustatud, halvasti allkirjastatud, liiga vana või erineva URL-i, meetodi või keha tagastab invalid_nostr_auth, mille põhjus on sõnumis; taaskasutatud üks naaseb nostr_auth_replayedAllkiri kontrollitakse enne keha lugemist ja iga aadress võib seda 30 korda minutis ebaõnnestuda (IPv6 aadress loeb kogu /64); pärast seda saab 429 koos Retry-After.

Kasutajad saavad kasutada neid veebipõhiseid veebisaite ainult oma veebisaitide kaudu (https://nymbot.ai, https://nymchat.app Leht mis tahes muul saidil ei saa CORS-i pealkirju tagasi, nii et see ei saa lugeda, mida nad tagastavad. OriginNad ei ole mõjutatud.

Sinu salajane võti

Allkirjastamine vajab teie nimmi salajast võtmest (selle nsec), mis kontrollib kõike: teie identiteeti, teie ajalugu ja teie tasakaalu.Ainult panna see skripti masinas, mida te usaldate, lugeda seda keskkonnast, mitte kirjutada seda failile ja eelistada rakendust, kui saate.

Need abistajad loovad pealkirja. Hiljem sellel lehel olevad näited kasutavad neid. NOSTR_SECRET_HEX; cURL üks kasutab Õnneks käsurea tööriist, mis võtab nsec või hex võtme, ja sha256sum MacOS kohta, 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");
}

Konto kokkuvõte

Mida rakenduse API leht ülaosas näitab: teie avalik võtm, mõlemad tasakaalud, kui palju võtmeid on aktiivsed (mitte tühistatud või aegunud) ja Automaatne top-up seaded või null kui server ei paku neid.

GET https://nymbot.ai/api/v1/account Vaja on a allkirjastatud taotlus.

vastus

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

Võtmete haldamine

Rakenduse võtme loendi taga olevad lõpp-punktid. allkirjastatud taotlusIga võti tagastatakse järgmises vormis koos aegadega ISO 8601 ja summad sats:

Peamised objektid

{
  "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 See on piisav, et tuvastada võti, kuid mitte seda kasutada.See võti tagastatakse ainult üks kord, kui see on tehtud.

Võtmete loendamine

GET https://nymbot.ai/api/v1/keys ja allkirjastatud.

väljadtüüpiNõutavKirjeldus
include_revokedBoolean (või küsimus)Ei oleSisaldab tühistatud võtmeid. vaikimisi false.

vastus

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

Võtme tegemine

POST https://nymbot.ai/api/v1/keys Tähelepanuväärne. tagastamine 201.

väljadtüüpiNõutavKirjeldus
nameStringidJah1 kuni 40 tähemärki, mis erinevad teistest aktiivsetest võtmetest (juhtumi ignoreerimine).
limit_satsintegreeritudEi oleKulutuskapis sats, vähemalt 1. jäta see ilma kapita.
reset_periodStringidEi oledaily, weekly või monthlyVajadused limit_satsJäta see välja kaane jaoks, mis ei taasta kunagi.
expire_atstring või integerEi oleKui võti ei tööta: ISO 8601 aeg või millisekundid alates 1970. aastast.

Ülevaade (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"
  }
}
staatuseMillal
400Puuduv või liiga pikk nimi; juba kasutusel olev nimi (duplicate_name); kap, mis ei ole vähemalt 1 täisarv; taastamisperiood ilma kapita; aegumine minevikus; tundmatu valdkond (unknown_parameter); või 25 aktiivset võtmet juba (too_many_keys).
429Üle 60 võtme, mis on tehtud selle nimega, või 120 sellest aadressist, tunnis (rate_limit_exceededja koos 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);

Ühe võtme lugemine

GET https://nymbot.ai/api/v1/keys/{id} ja allkirjastatud.

Tagastamine {"data": {…}} võtmeobjekti või 404 key_not_found kui teie võtmel ei ole seda ID-d.

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

Võtme muutmine

PATCH https://nymbot.ai/api/v1/keys/{id} ja allkirjastatud.

Saada mõni name, limit_sats, reset_period ja expire_atsamad reeglid nagu võtme tegemisel. null tühjendab välja: ei ole lukku, ei ole taastamist, ei ole aegumist. Taastamisperioodi muutmine algab uue perioodi nullist. tühistatud võtmet ei saa muuta (400 key_revoked) tagasitulek {"data": {…}} värskendatud võtiobjekti abil.

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

Võtme tühistamine

DELETE https://nymbot.ai/api/v1/keys/{id} ja allkirjastatud.

Peatab võtme korraga, hea. see jääb nimekirja revoked_at seatud, ja saab näha koos include_revoked=trueVõtme tühistamine, mis on juba tühistatud, vastab samamoodi. Ainult viimase 50 tühistatud võtme säilitatakse; vanemad võtmed kustutatakse, kui teine võtme tühistatakse.

vastus

{ "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 ülevaade

Ühendage Lightning rahakott Nostr Wallet Connect'iga ja Nymbot tõstab tasakaalu iseenesest, kui API kulutused on madalad. allkirjastatud taotlus.

Kuidas see toimib: pärast API taotlust laaditakse saldale, mida otsustasite vaadata, kui see saldo on langenud alla teie künnise, teeb Nymbot arve teie ülemise summa eest, palub teie rahakotil seda maksta ja lisab krediidi. See ületab maksimaalselt üks kord iga 5 minuti järel iga nimmi ja saldo eest, nii et paljude taotluste purunemine ei saa rahakotit tühjendada. Rakendustes kulutamine ei käivita seda. Viimase ülemise ja viimase vea aeg ja suurus on seadetes; kui makse läks läbi pärast vea, kontrollige selle arvet Top-up seisund krediiti selle eest.

Enne kui ühendate rahakoti

Nymbot salvestab selle krüpteeritud ja kasutab seda ainult oma top-up arvete tasumiseks, kuid tehke ühendus just selleks, oma rahakotis kulude eelarvega, nii et kõige rohkem võiks see kunagi maksta on number, mille valisite. rahakott peab toetama pay_invoice.

Ühendage rahakott

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect ja allkirjastatud.

väljadtüüpiNõutavKirjeldus
nwc_urlStringidJahÜhendus string, alustades nostr+walletconnect://Nymbot küsib rahakotti get_info enne salvestamist ja salvestab selle krüpteeritud.
threshold_satsintegreeritudJahÜles, kui tasakaal langeb alla selle paljude sats.
topup_satsintegreeritudJahKui palju lisada iga kord. 1000 kuni 1000 000 sats.
tierStringidEi olepro (default) või standard: tasakaal vaadata ja top up.

vastus

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
staatuseMillal
400Ei ole ühendus string (invalid_nwc_url(Käesolevas artiklis ei ole kirjutatud ühtegi vastust selle kohta, milline see on)nwc_unreachable) või keeldus kontrollimisest (nwc_rejected(See ei tähenda, et te ei saa maksta arveid)nwc_missing_permission(või summa väljaspool piiranguid.
501Automaatne üleslaadimine ei ole selle serveri jaoks sisse lülitatud (nwc_unavailableSama kehtib ka kahe teise lõpp-punkti kohta.

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

Seadete lugemine

GET https://nymbot.ai/api/v1/nwc-auto-topup ja allkirjastatud.

Tagastab sama objekti, mis ühendab, connected: false ja teised väljad null kui ühtegi rahakotti ei ole ühendatud, ei tagastata ühenduse stringit kunagi.

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

Lahtiühendamine

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection ja allkirjastatud.

Kustutab salvestatud ühenduse string. Rohkem üleminekut ei tehta. Et olla kindel, saate ka oma rahakoti ühenduse tühistada.

vastus

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

Tasumine taotluse korral ilma võtmeta

Fikseeritud hinna lõpp-punkte saab maksta ühe taotluse eest korraga üle Lightning'i, ilma võtme, kontoga ja tasakaaluta: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations ja POST /embeddingsVestlused, vastused ja sõnumid vajavad alati võtmet.Küsimus, millel on võti, arvutatakse saldale tavapäraselt; maksevoog algab ainult siis, kui võtmet ei ole saadetud.

Nymbot räägib samast ideest kahest versioonist ühest backendist: Lightning Labs'ist L402 kohta (Samuti aktsepteeritud oma vana nime all, LSATIETF eelnõu maksmine HTTP autentimise süsteem koos lightning meetod ja charge Kasutage seda, mida teie klient mõistab.

Käivitage oma server

Maksmine ilma võtmeta on ainult siis, kui API_L402_SECRET sisaldab vähemalt 32 juhuslikku baiti, näiteks hex (64 tähemärki) või base64 (44). openssl rand -hex 32Lühem või arvutatav väärtus lülitab funktsiooni välja ja logib, miks. API_L402_SECRET_PREVIOUS ühe päeva jooksul: volitused, staatuse URL-id ja selle alusel tehtud väljakutsed töötavad kuni nende aegumiseni.

Väljakutse

Saada taotlus koos ei Authorization kui see on kehtiv, ei tööta midagi ja sa saad 402 Payment Required arvel täpselt, mida see taotlus maksab: sama hind, mille võtme maksaks, teisendatakse 10 sats standardkrediidi või 100 sats Pro krediidi ja ümardatakse kuni terve sat (vähemalt 1 sat ja vähemalt 0.05 krediidi miinimum). WWW-Authenticate Probleemid samale arvele:

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

maksmine request Parameeter on base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Üks väljakutse on seotud lõpp-punktiga, Content-Type (meedia tüüp ja mitmeosalise puhul selle piir) ja SHA-256-le saadetud täpse keha byte ja kestab 15 minutit. identsed Järjekordne taotlus: sama Content-Type ja samad JSON-baidid või mitmeosaliste lõpp-punktide jaoks (/images/edits, /audio/transcriptions, /audio/translationsEnamik HTTP-raamatukogusid valib iga kord, kui nad kodeerivad vormi, uue piiri, seega kodeerige see üks kord ja saatke need baidid kaks korda.

Iga aadress võib küsida 30 väljakutset minutis (IPv6 aadress loeb oma tervikuna /64). Taotlused, kelle aadress ei ole teada jagada rangem 10 minutis, ja seal on üldine piirmäär väljakutsete Nymbot probleeme kõikides aadressides; taotlus tagasi lükatud enne väljakutse tehakse (näiteks keha, mis ei ole kehtiv JSON) ei loe selle vastu. 429 koos Retry-AfterTasustatud lõpp-punktid, mida kutsutakse ilma võtme või volitusteta, loetakse ka üldise piirini 120 autentimata taotluse minutis aadressile. Content-Type Ei ole application/json (või multipart/form-data ülekandmisest) on keeldunud 415 Ja ei saa kunagi arvet.

Sisseehitused hinnatakse sisendil olevate tokenite hinnangul, mille marginaal on 1,5 korda, kuna tegelik arv on teada alles pärast seda. Tagastatud token.

Makse saatmine

Maksa arve mis tahes Lightning rahakott. rahakott annab teile eelvaade, 64 kuus tähemärki. Seejärel saatke sama taotlus ühe neist:

skeemidHeaderid
L402 kohtaAuthorization: L402 <macaroon>:<preimage> (LSAT Töötab ka
maksmineAuthorization: Payment <base64url JSON>kus JSON on {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Tasuline taotlus vastab täpselt nagu võtmega tehtud taotlus, välja arvatud see, et nymbot objekti tasakaaluväljad puuduvad: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}Ja seal ei ole X-Nymbot-Balance-Sats Header. maksesüsteemiga makstud taotlus saab ka Payment-Receipt pealkiri (base64url JSON koos väljakutse id, makse hash kui reference, status ja timestampTasulised päringud ei ole seotud ükskõik millise nimega, nii et need ei ilmu päringute ajaloos.

staatuseMillal
402 payment_already_usedIga makse maksab ühe taotluse eest.Vastus on selle taotluse jaoks uus väljakutse, nii et klient, kes vahemälu oma viimase volituste (nagu lnget See tähendab lihtsalt, et taastatakse jälle.
402 payment_mismatchKrediit on välja antud mõnele teisele lõpp-punktile, Content-Type või keha, või maksta vähem kui see taotlus nüüd maksab. uue väljakutse selle taotluse kaasas; kui makse oli liiga väike, mida sa maksid tagasi tagasi Tagastatud token (refund_token ja refund_sats See on kehas).
402 payment_expiredRohkem kui 15 minutit on möödunud alates väljakutsest. Uus väljakutse kaasneb sellega. Kui eelvaade näitab, et olete tasunud, siis see, mida olete tasunud, tuleb tagasi kui väljakutse. Tagastatud token (refund_token ja refund_sats üks kord kehas; seejärel kasutatakse usaldusväärsust.
401 invalid_preimageEelkuju ei hash arve makse hash. makse ei kasutata.
401 invalid_payment_credentialTeave on vääralt vormistatud, muudetud pärast seda, kui Nymbot on selle välja andnud, või nime makse hash Nymbot ei ole kunagi väljastanud arvet.
429 rate_limit_exceededRohkem kui 30 volitusi või võtmeid, mis ei suutnud kontrollida, tuli sellest aadressist minutis või üks tagasimaksetokiin saadetakse rohkem kui 60 korda minutis. 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"));

Kliendid on ehitatud mppx Lightning meetodiga tegeleda makse väljakutse ise; suunata neid lõpp-punkti ja lasta neil maksta.

Videod

tasustatud POST /videos Vastused 202 Nagu võti üks, pluss a status_url: GET See on allkirjastatud ja töötab 24 tundi, nii kaua kui tööd hoitakse.

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

Hoidke seda refund_token Vastust: see on näidatud ainult siin. See on tühi, kui video renderib (GET /api/v1/l402/refunds Vastused "status": "pending"); kui renderimine ebaõnnestub arveldamata, maandub makse sellel. refund_sats tagastatud töö eest, kuid mitte kunagi märgi eest, nii et oleku URL-i jagamine ei jaga tagasimakset.

Tagasimaksed

Kui tasustatud taotlus ebaõnnestub ja teenusepakkuja maksab Nymboti katse eest, hoitakse makse ja viga ütleb nii, charged_satsKui see ebaõnnestub ilma arveldamata, tekitab viga Tagastatud token Väärib seda, mida sa maksad:

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

Kasutamata osad tulevad tagasi samamoodi: kui te palusite kahte pilti ja üks ebaõnnestus arveldamata, edukas vastus nymbot objekt kannab tagasimaksetokenit puuduva jaoks; transkript, mille pikkust ei saa eelnevalt lugeda, hinnatakse nii kaua, kui fail võib olla (mitte kunagi rohkem kui 30 minutit) ja erinevus tegelikule pikkusele tuleb tagasi tagasimaksetokenina; kui see osutub pikemaks kui 30 minutit, lükatakse see tagasi 413 ja kogu makse tagastatakse.Sisseehitused tagastavad selle, mida hinnanguliselt kinni peeti.Ebaõnnestunud video tagastab oma esitatud märgi.

Tagasimaksetoken on juhuslik 256-bitine kood. Nymbot salvestab ainult oma hash-i ja see aegub 30 päeva pärast.

  • Maksa sellega ära. saatke Authorization: Bearer REFUND-… Kõigist eelnevatest lõpp-punktidest (OpenAI SDK võtab selle oma API võtmeks).refund_token_sats Selles nymbot Objekti väärtus on väiksem kui taotluse vastused 402 refund_insufficient; tasumata ebaõnnestumine paneb sats tagasi samale tokenile.
  • Kontrolli seda ära. GET /api/v1/l402/refunds Samal headeril tagastatakse {"sats": 237, "status": "open", "expires_at": "..."}.
  • Ühte tokenit saab kasutada maksimaalselt 60 korda minutis.
  • Seejärel liigutage see nym. Pane see sisse Võta kingitus tagasi Nymboti rakenduses või helistades POST /api/v1/l402/refunds/redeem koos a allkirjastatud taotlus ja {"refund_token": "REFUND-...", "balance": "standard"} (või "pro"Kogu krediidid lähevad saldo (10 sats iga standard, 100 Pro); sats, mis ei tee kogu krediidi jääda token API taotlusi.

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"

vastus

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