Farðu yfir í innihaldið
Aftur til Nymbot

Þekkingargrunnur Framleiðendur

Balans, toppur og lykla

Skoðaðu hvað þú hefur, yfirgefa Lightning, yfirgefa sjálfkrafa úr eigin veskinu, sjá hvað hver beiðni kostar og stjórna lykjum úr kóði.

Skoðað jafnvægi

Bæði jafnvægi þitt, og hversu mikið af hápur þessarar lykla er notað.

GET https://nymbot.ai/api/v1/credits/balance Þarf að nota API lykil. POST Það virkar líka, fyrir viðskiptavini sem bíður það.

balance er tveir jafnvægi saman í dollara við núverandi Bitcoin verð, fyrir verkfæri sem búast við einni númer (null Ef verð er ekki hægt að lesa). restin er í kreditum og sats, sem er hvernig jafnvægi eru í raun haldið. key Lykill sem hefur náð hæðinni getur samt athugað jafnvægi.

Svarið

{
  "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"
  }
}
StaðsetningÞegar
401Lykillinn er saknað, óþekktur, afturkallaður eða upphafinn.

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

Fjárfestingarnar

Hvernig þú getur topp upp, og takmarkanir. Lightning er eina aðferðin.

GET https://nymbot.ai/api/v1/topup/payment-methods Engin lykill þörf.

A top-up er 10 til 1.000.000 sats; Pro top-up þarf að kaupa að minnsta kosti einn Pro kredit, svo það byrjar á 100 sats. bulk_bonus listar auka kredit á stærri toppur, eins og í app: 10%, 15% eða 20% meira á venjulegum toppur frá 500, 1.000 eða 5.000 sats, og á Pro toppur frá 5.000, 10.000 eða 50.000 sats.

Svarið

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

Stíga upp yfir Lightning

Gerir Lightning reikning sem bætir kredit til nym sem lykillinn tilheyrir. borga það frá hvaða Lightning veski, þá Skoðaðu það Til að fá kreditinn bætt.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning Þarf að nota API lykil.

Fieldstegundnauðsynlegtlýsingu
amountFjöldiJáHversu mikið, í currencyFullt númer fyrir sats.
currencyStrengiðNei ekkiSATS (Það er að minnsta kosti, USD eða BTCDollar eru breytt á núverandi Bitcoin verð.
tierStrengiðNei ekkipro (Það er skortur) eða standard: hvaða jafnvægi kreditinn fer til.

A venjulegur kredit er 10 sats og Pro kredit 100 sats, auk hvaða bulk bónus; credits segir hvað þessi reikning mun bæta við.

Svarið

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
StaðsetningÞegar
400Aðrar leiðir á leiðinni (unsupported_method, óþekktur gjaldmiðill (unsupported_currencyHægt er að taka þátt í því sem er að minnsta kosti, eða að minnsta kosti (amount_too_small, yfir 1000 milljónir sats (amount_too_large) eða hafnað af Lightning veski (amount_out_of_range).
429Meira en 60 reikningar fyrir þessa nym, eða 120 frá þessari heimilisfang, á klukkustund (rate_limit_exceeded, með Retry-After).
502Það er ekki hægt að taka þátt í því núna (invoice_unavailable, með 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);

Skoðaðu top-up

Spyr hvort reikningurinn hafi verið greiddur og þegar það hefur, bætir það við kreditinn. creditedAð athuga aftur síðar er öruggt: kredit landar einu sinni, sama hversu oft þú spyrð.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - þarf lykil frá nym sem gerði reikninginn.

status er pending (Það er ekki greitt ennþá) paid (Að borga, en ekki enn kredit; athugaðu aftur), credited (á jafnvægi þínu) eða expired (ekki borgað á tíma). Fjárhæðin eru fyrir stigið sem reikningurinn toppar upp.

Svarið

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
StaðsetningÞegar
400ID er ekki 64 stafrænt ID frá því að búa til símann.
404Það er ekki hægt að taka þátt í því með því að þú sért ekki með þinn NM (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);

Vilja sögu

Eitt röð á beiðni: hvað það var, hvaða gerð, hversu mörg tokens og hvað það kostar. Engar tilkynningar eða svör eru haldnir, þannig að enginn er endurgreitt. Rings eru haldnir í 90 daga, nýjasta fyrst. Lykill sem hefur náð hæðinni getur enn lesið sögu sína.

GET https://nymbot.ai/api/v1/queries/history - þarf API lykil, sem sér eigin beiðni, eða undirritað beiðni frá nym þínum, sem sér hvern lykla.

Fieldstegundnauðsynlegtlýsingu
pageNiðurstöður (Query)Nei ekkiStandard 1, hámarks 1.000; hærri síða er 400 invalid_value.
page_countNiðurstöður (Query)Nei ekkiRings per page. Default 20, að hámarki 100.
start_date
end_date
Þátttakendur (QueryNei ekkiISO 8601 dagsetningar eða tímar.
modelÞátttakendur (QueryNei ekkiAðeins þessi líkan.
typeÞátttakendur (QueryNei ekkichat, responses, messages, image, video, speech, transcription eða embedding.
all_keysBoolean (frá spurningunni)Nei ekkiOg með lykil: true inniheldur alla lykla af sama nym. false.
key_idÞátttakendur (QueryNei ekkimeð undirritaða beiðni eða með all_keys=trueBara þessi lykill.

Svarið

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

Skilaboð um beiðni

Að búa til, breyta og endurgreiða lykla, reikningarsammtöku og sjálfkrafa upphæðir taka ekki API lykla. Þeir taka undirskrift frá nym þínu, þannig að leaked lykla getur eytt upp til hliðarinnar en getur aldrei gert aðra lykla eða hækka eigin hliða.

The app gerir þetta fyrir þig: allt í sínu Eldur Þú þarft aðeins þessa kafla til að stjórna lyklum úr eigin kóði.

Skýrslan er Nostr atburður af tegund 27235 (NIP-98), sendur base64-kóðað í Authorization Header með orði Nostr í framan:

Atburðurinn

{
  "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 er fullur URL beiðninni, spurningartengd þar með, nákvæmlega eins og sent.
  • method Þetta er HTTP aðferðin.
  • payload er SHA-256 af rauðu beiðni líkama, í hex. Það er nauðsynlegt á POST og PATCH, og líkaminn sem þú sendir verður að vera byte fyrir byte sem þú hashed.
  • created_at Það þarf að vera innan 60 sekúndna klukkustunda þjónustunnar.
  • Hver atburður virkar einu sinni, a GET þar með, þannig að tekinn header er ekki hægt að endurspila. Skrifaðu nýjan fyrir hverja beiðni. Bæta við nonce Tákn með handahófi gildi þannig að tveir beiðnir undirritaðir á sama sekúndu eru samt mismunandi.
  • Líkaminn að undirrita beiðni getur verið að hámarki 64 KB, og líkaminn þarf Content-Type: application/json.

Mistakinn atburður kemur aftur 401 missing_nostr_autheinn sem er slæmt myndaður, slæmt undirritaður, of gamall, eða fyrir mismunandi URL, aðferð eða líkama returns invalid_nostr_auth, með ástæðu í skilaboðinu; endurnýja einn endurnýjar nostr_auth_replayedÁskriftin er athugað áður en líkaminn er lesið, og hver heimilisfang getur misheppnað því 30 sinnum á mínútu (IPv6 heimilisfang telst sem heilt /64); eftir það fær það 429 með Retry-After.

Hugbúnaðurinn getur aðeins hringt á þessar endapunkta frá eigin vefsíðum Nymbot (https://nymbot.ai, https://nymchat.app Síðuna á öðrum vefsvæðum fær engin CORS heitir aftur, þannig að hún getur ekki lesið það sem þau koma til baka. OriginÞeir eru ekki fyrir áhrifum.

leyndarmálið þitt

Að undirrita þarf leyndarmálið þitt (e. the secret key of your nym). nsecAðeins setja það í handrit á vél sem þú treystir, lesa það frá umhverfi í stað þess að skrifa það inn í skráninguna og kjósa appinn þegar þú getur.

Þessir hjálpar byggja header. síðar dæmi á þessari síðu nota þá. Þeir lesa leyndarmálið í hexum frá NOSTR_SECRET_HEX; cURL einn notar Nák skipulag, sem tekur nsec eða hexahlutann, og sha256sum í macOS, shasum -a 256).

cURL

nostr_auth() {
  method="$1"; url="$2"; body="$3"
  nonce=$(openssl rand -hex 16)
  if [ -n "$body" ]; then
    hash=$(printf '%s' "$body" | sha256sum | cut -d' ' -f1)
    event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce" -t "payload=$hash")
  else
    event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce")
  fi
  printf 'Nostr %s' "$(printf '%s' "$event" | base64 | tr -d '\n')"
}

Python

# pip install coincurve requests
import base64, hashlib, json, os, time
from coincurve import PrivateKey, PublicKeyXOnly

SECRET = bytes.fromhex(os.environ["NOSTR_SECRET_HEX"])

def nostr_auth(method, url, body=b""):
    pubkey = PublicKeyXOnly.from_secret(SECRET).format().hex()
    tags = [["u", url], ["method", method], ["nonce", os.urandom(16).hex()]]
    if body:
        tags.append(["payload", hashlib.sha256(body).hexdigest()])
    created_at = int(time.time())
    serialized = json.dumps([0, pubkey, created_at, 27235, tags, ""], separators=(",", ":"), ensure_ascii=False)
    event_id = hashlib.sha256(serialized.encode()).digest()
    event = {
        "id": event_id.hex(),
        "pubkey": pubkey,
        "created_at": created_at,
        "kind": 27235,
        "tags": tags,
        "content": "",
        "sig": PrivateKey(SECRET).sign_schnorr(event_id).hex(),
    }
    return "Nostr " + base64.b64encode(json.dumps(event).encode()).decode()

JavaScript

// npm install nostr-tools
import { createHash, randomBytes } from "node:crypto";
import { finalizeEvent } from "nostr-tools/pure";

const secret = Buffer.from(process.env.NOSTR_SECRET_HEX, "hex");

export function nostrAuth(method, url, body = "") {
  const tags = [["u", url], ["method", method], ["nonce", randomBytes(16).toString("hex")]];
  if (body) tags.push(["payload", createHash("sha256").update(body).digest("hex")]);
  const event = finalizeEvent(
    { kind: 27235, created_at: Math.floor(Date.now() / 1000), tags, content: "" },
    secret,
  );
  return "Nostr " + Buffer.from(JSON.stringify(event)).toString("base64");
}

Samþykkt reikning

Hvað API skjal app sýnir efst: opinbera lykillinn þinn, bæði jafnvægi, hversu margir lyklar eru virkar (ekki afturkallaðar né upphæðir), og Sjálfvirkur top-up uppsetningar eða null þegar þjónustan býður þeim ekki.

GET https://nymbot.ai/api/v1/account Þarf að a undirritað beiðni.

Svarið

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

Að stjórna lykjum

Endpoints á bak við lykillist app. Allir þeirra þurfa undirritað beiðniHver lykill er skilaður í þessari formi, með tímum í ISO 8601 og upphæðum í sats:

Mikilvægt hlutverk

{
  "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 Það er nóg til að viðurkenna lykil en ekki nota það.Keysið sjálft er aðeins gefið aftur einu sinni, þegar það er gert.

Listið lykla

GET https://nymbot.ai/api/v1/keys að undirrita.

Fieldstegundnauðsynlegtlýsingu
include_revokedBoolean (frá spurningunni)Nei ekkiInniheldur endurgreitt lykla. false.

Svarið

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

Að gera lykil

POST https://nymbot.ai/api/v1/keys Skrifað. aftur 201.

Fieldstegundnauðsynlegtlýsingu
nameStrengiðJá1 til 40 stafi, öðruvísi en aðrar virkar lyklar þínar (gleyma tilfelli).
limit_satsÍtrekaðNei ekkiÁætlað er að leggja út kostnaðinn í sats, að minnsta kosti 1. Láttu það út fyrir engin cap.
reset_periodStrengiðNei ekkidaily, weekly eða monthlyÞörf limit_satsLáttu það í burtu fyrir háp sem aldrei endurheimtir.
expire_atString eða integerNei ekkiÞegar lykillinn hættir að vinna: ISO 8601 tíma, eða millisekúndur frá 1970.

Svar við (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"
  }
}
StaðsetningÞegar
400Nánari eða of lengi nafn; nafn sem þegar er í notkun (duplicate_name); hár sem er ekki heilt tal af að minnsta kosti 1; endurheimta tímabil án hár; upphæð í fortíðinni; óþekktur svið (unknown_parameter); eða 25 virkar lykla nú þegar (too_many_keys).
429Meira en 60 lykla gerðar af þessum nym, eða 120 frá þessari heimilisfang, á klukkutíma (rate_limit_exceeded, með 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);

Að lesa einn lykillinn

GET https://nymbot.ai/api/v1/keys/{id} að undirrita.

Aftur {"data": {…}} með lykilatriði, eða 404 key_not_found ef enginn lykillinn þinn hefur þennan ID.

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

Breyting á lykil

PATCH https://nymbot.ai/api/v1/keys/{id} að undirrita.

Sendu einhverjum name, limit_sats, reset_period og expire_at, með sömu reglum eins og þegar að gera lykil. null Það er ekki hægt að skipta um að þú sért að skipta um að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta á að þú sért að skipta (400 key_revoked• Til baka {"data": {…}} með uppfærða lykilobjekti.

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

Hreyfing á lykil

DELETE https://nymbot.ai/api/v1/keys/{id} að undirrita.

Stoppur lykillinn strax, til góðs. Það er í listanum með revoked_at sett, og er hægt að sjá með include_revoked=trueAð afturkalla lykil sem hefur þegar verið afturkallað svarar á sama hátt. Aðeins nýjustu 50 afturkallaðar lykil eru haldnir; eldri lykil eru fjarlægt þegar annar lykill er afturkallaður.

Svarið

{ "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 áætlun

Að tengja Lightning veskið með Nostr Wallet Connect og Nymbot toppar upp jafnvægi af sjálfu sér þegar API kostnaður hlaupa það lágt. API blaðið á forritinu hefur sömu stillingar; þetta eru endapunkturnar á bak við það. undirritað beiðni.

Hvernig það virkar: Eftir að API beiðni er tekin upp á jafnvægi sem þú velur að horfa, ef jafnvægi hefur fallið undir þörf þína, gerir Nymbot reikning fyrir upphæðina þína, biður veskinu þína um að borga það og bætir við kreditinn. Það toppar upp að hámarki einu sinni á 5 mínútur fyrir hverja nym og jafnvægi, þannig að brjót af beiðnum getur ekki drukknað veskinu. Borgað í forritunum kveikur það ekki. Tíminn og stærðin á síðasta upphæðinni, og síðasta mistök, eru í stillingum; ef greiðsla gekk í gegnum eftir mistök, athugaðu reikninginn með Top-up ástandið kredit á það.

Áður en þú tengir veskinu

Nymbot geymir það dulkóðað og notar það aðeins til að borga eigin upphaflega reikninga, en gera tengingu bara fyrir þetta, með útgjöld fjárhagsáætlun í veskinu þínu, svo mest það gæti nokkru sinni borgað er númer valið þig. pay_invoice.

Til að tengja veskið

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect að undirrita.

Fieldstegundnauðsynlegtlýsingu
nwc_urlStrengiðJáSamskiptavefurinn, sem hefst nostr+walletconnect://Nymbot biður um veskinu get_info áður en það er geymt, og geymir það dulkóðuð.
threshold_satsÍtrekaðJáHæsta upp þegar jafnvægi fellur undir þessum mörgum sats.
topup_satsÍtrekaðJáHversu mikið á að bæta við á hverjum tíma. 1.000 til 1.000.000 sats.
tierStrengiðNei ekkipro (Það er skortur) eða standard: jafnvægi til að horfa og topp upp.

Svarið

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
StaðsetningÞegar
400Hægt er að koma í veg fyrir tengingu (invalid_nwc_url); veskið svaraði ekki við sendinguna (nwc_unreachable) eða hafnað skoðun (nwc_rejected); tengingin getur ekki borgað reikninga (nwc_missing_permission) eða upphæð sem er utan takmarka.
501Sjálfvirk upphæðar eru ekki kynntar fyrir þessa þjónusta (nwc_unavailableÞað sama gildir um hinar tvær endapunktur.

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

Að lesa stillingarnar

GET https://nymbot.ai/api/v1/nwc-auto-topup að undirrita.

Returns sama hlutinn sem tengja, með connected: false og hinum sviðum null þegar engin veski er tengd. Samkvæmt tengslinni er aldrei endurgreitt.

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

Afskipti

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection að undirrita.

Sletur geymdu tengslakerfið. Engar fleiri upphæðar eru gerðar. Til að vera viss, þú getur einnig afturkallað tengslina í veskinu þínu.

Svarið

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

Borga á beiðni án lykla

Fasta verð endapunktur geta verið greiddar fyrir einn beiðni á einu sinni yfir Lightning, án lykla, ekki reikning og engin jafnvægi: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations og POST /embeddingsSpjall, svör og skilaboð þurfa alltaf lykil. Áspurn sem er með lykil er tekin inn á jafnvægi eins og venjulega; greiðsluflæði hefst aðeins þegar enginn lykill er sent.

Nymbot talar um tvær útgáfur af sömu hugmynd, frá einum bakhliða: Lightning Labs L 402 (Og einnig viðurkennd undir gamla nafni sínu, LSAT) og IETF áætlun greiðslu HTTP authentication kerfi með lightning aðferð og charge Notaðu það sem viðskiptavinur þinn skilur.

Að keyra þinn eigin server

Að borga án lykla er aðeins á þegar API_L402_SECRET inniheldur að minnsta kosti 32 handahófi bytes, eins og hex (64 stafi) eða base64 (44). openssl rand -hex 32Stærri eða giskaðari gildi slökkur á eiginleikanum og skráir af hverju. API_L402_SECRET_PREVIOUS í einn dag: staðfestingar, stöðu URLs og áskorun sem gerðar eru undir því halda áfram að vinna þar til þeir eru lokið.

Áskorunin

Sendu beiðni með NEI Authorization header. Ef það er gild, er ekkert í gangi og þú færð 402 Payment Required með reikning fyrir nákvæmlega það sem beiðni kostar: sama verð sem lykill myndi borga, breytt í 10 sats a venjulegur kredit eða 100 sats a Pro kredit og hrundið upp í heilt sat (að minnsta kosti 1 sat, og að minnsta kosti 0.05 kredit minnsta). WWW-Authenticate Áskorun fyrir sömu reikninga:

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

greiðslu request Hægt er að nota base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Áskorun er tengd endalokinu, til Content-Type (medía tegund hennar og, fyrir multipart, landamæri hennar) og til SHA-256 nákvæmlega líkama bytes sem þú sendir, og varir 15 mínútur. sömu Ákvarðað aftur: Sama Content-Type og sömu JSON bytes, eða fyrir multipart endpoints (/images/edits, /audio/transcriptions, /audio/translationsFlestir HTTP bókasafni velja nýja takmörk í hvert skipti sem þeir kóða eyðublað, svo kóða það einu sinni og senda þessar bytes tvisvar.

Hver heimilisfang getur beðið um 30 áskorun á mínútu (IPv6 heimilisfang telst sem heilt /64). Áskorun sem heimilisfang er ekki þekkt deila strangari 10 á mínútu, og það er heildar takmörk á áskorunum Nymbot á öllum heimilisfangum; beiðni hafnað áður en áskorun er gerð (til dæmis með líkamanum sem er ekki gild JSON) telst ekki til þess. 429 með Retry-After, sendur áður en líkaminn er lesið. Betil endapunktur kallað án lykla eða trúnaðaraðila einnig teljast í átt að almennri takmörkun 120 óönnuð beiðni á mínútu á heimilisfang. Content-Type Er ekki application/json (eða multipart/form-data fyrir uppsetningar) er hafnað með 415 og aldrei fá reikning.

Embeddings eru verðlaun frá upphæð tokens í inntakinu, með 1.5× marg, þar sem raunveruleg reikning er aðeins þekkt síðar. Þú greiðir fyrir tokens í raun notuð, og ónotuð hluti greiðslunnar kemur aftur sem Endurgreiðsla token.

Sendu greiðsluna

Greiða reikninginn með hvaða Lightning veski sem er. veskið gefur þér fyrirmyndina, 64 hexagraf. Síðan senda sömu beiðni með einum af þessum:

áætlunHeiðar
L 402Authorization: L402 <macaroon>:<preimage> (LSAT einnig að vinna)
greiðsluAuthorization: Payment <base64url JSON>þar sem JSON er {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Greitt beiðni svarar nákvæmlega eins og það sem gerð er með lykil, nema að nymbot Object hefur ekki jafnvægi: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}Og það er ekki X-Nymbot-Balance-Sats Header.Fyrirspurning sem greidd er með greiðslusysteminu fær einnig Payment-Receipt header (base64url JSON með áskorunum id, greiðslu hash eins og reference, status og timestampBettir beiðnir eru ekki tengdir neinum nym, þannig að þeir birtast ekki í spurningahistóríki.

StaðsetningÞegar
402 payment_already_usedHver greiðsla greiðir fyrir einni beiðni. svarið er nýtt áskorun fyrir þessa beiðni, þannig að viðskiptavinur sem safnar síðasta trúnaðargögnum sínum (eins og lnget Það er einfaldlega landið aftur.
402 payment_mismatchSkilaboðin voru gefin út fyrir annað endapunkt, Content-Type eða líkama, eða borga minna en þessi beiðni kostar núna. Frábær áskorun fyrir þessa beiðni kemur með því; ef greiðsla var of lítil, það sem þú borgaðir kemur aftur sem Endurgreiðsla token (refund_token og refund_sats í líkama okkar).
402 payment_expiredMeira en 15 mínútur eru liðin frá áskoruninni. Frábær áskorun kemur með því. Ef fyrirmyndin sýnir að þú hefur borgað, kemur það sem þú hefur borgað aftur sem áskorun. Endurgreiðsla token (refund_token og refund_sats í líkamanum), einu sinni; kredential er þá notað upp.
401 invalid_preimageFyrirmyndin hashar ekki við greiðslu hash á reikningnum.
401 invalid_payment_credentialSkilaboðin er mismunandi, var breytt eftir að Nymbot gaf út það, eða heitir greiðslu hash Nymbot hefur aldrei gefið út reikning fyrir. Makaron með viðvörun Nymbot veit ekki, eða með andstæðar viðvörun, er hafnað.
429 rate_limit_exceededMeira en 30 trúnaðarefni eða lykla sem ekki var hægt að staðfesta komu frá þessari heimilisfang á mínútu, eða einn endurgreiðslu token var sent meira en 60 sinnum á mínútu. 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"));

Viðskiptavinir byggð á mppx með Lightning aðferð að takast á við greiðslu áskorun sjálfur; leiða þá á endanum og láta þá borga.

Myndbönd

Að borga POST /videos Svör 202 eins og einn, plús a status_url: GET Það er undirritað og virkar í 24 klukkustundir, svo lengi sem starf er haldið.

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

Haltu því refund_token Á þessari síðu er hægt að skoða myndbandið, þar sem myndbandið er hreint (GET /api/v1/l402/refunds Svör "status": "pending"); ef útgáfa misheppnar án reikninga, landar greiðsla á henni. refund_sats Fyrir endurgreitt starf en aldrei táknið, svo að deila stöðu URL deilir ekki endurgreiðslu.

Endurgreiðslu

Ef greitt beiðni misheppnar og birgirinn borgaði Nymbot fyrir tilraunina, er greiðsla haldið og mistök segir svo, með charged_sats, nákvæmlega eins og fyrir lykill tilkynningu. Ef það misheppnar án þess að reiknað sé, fær mistök Endurgreiðsla token Það er þess virði sem þú borgar:

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

Ónottaðir hlutar koma aftur á sama hátt: Ef þú baðst um tvær myndir og eitt missti unfatted, árangur svarið nymbot Object er með endurgreiðslu token fyrir missandi einn; útskrift sem lengd gæti ekki verið lesið upp fyrir framan er verðlaun fyrir lengsta sem skrá gæti verið (aldri en 30 mínútur), og munurinn á raunveruleg lengd kemur aftur sem endurgreiðslu token; ef það kemur út að vera lengri en 30 mínútur, það er hafnað með 413 Innborgun endurgreiðir það sem upphæðin hefur haldið aftur. A misheppnuð myndbönd endurgreiðir tókninn sem sendingin hennar var endurgreidd.

A endurgreiðslu token er handahófi 256-bit kóða. Nymbot geymir aðeins hash hennar, og það er lokið eftir 30 daga. Það er haldið sat jafnvægi, og þú getur:

  • Borgaðu með því. Sendu Authorization: Bearer REFUND-… Hægt er að taka upp áætlunina (e. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. b. a. a. a. a. a. a. a. a. a. a. a. a. a. a. a. b. a. a. a. a. a. a. a. b. a. a. a. a. a. a. a. a. a. a. b. a. a. a. a. a. a. b. a. a. a. arefund_token_sats í the nymbot A token virði minna en beiðni svör 402 refund_insufficient; Unbiled mistök setur sats aftur á sömu token.
  • Skoðaðu það. GET /api/v1/l402/refunds með sama header kemur aftur {"sats": 237, "status": "open", "expires_at": "..."}.
  • Eitt token er hægt að nota hámarki 60 sinnum á mínútu.
  • Hreyfðu það á nym. Passaðu því inn Búið að gefa gjöf í Nymbot forritinu eða hringja POST /api/v1/l402/refunds/redeem með A undirritað beiðni og {"refund_token": "REFUND-...", "balance": "standard"} (eða "pro"Allir kröfur fara í jafnvægi (10 satsir hver á staðlaða, 100 á Pro); satsir sem gera ekki allt kreditinn að vera á token fyrir API beiðnir.

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"

Svarið

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