Laktawan ti linaonna
Addaan iti Nymbot.

Batayan ti pannakaammo Developer iti

Naaddaankami iti top-ups ken keys.

Ikonektartayo ti inaramidko, ipatpatpatulod iti Lightning, ipatpatulod iti automatiko manipud iti inaramidko a wallet, ipatulodda ti inaramidko ti tunggal request, ken ipatulod kadagiti key manipud iti code.

Ituloymi daytoy balanse

Ipapaupana ketdi ti kaaduan kadagitoy no kalgaw.

GET https://nymbot.ai/api/v1/credits/balance Naaddaankami iti API Key. POST Ngem saan a nagpateg a nagpateg ti customer a nagpategda.

balance Kuna ti dua a balanse iti dolyar iti current Bitcoin price, para kadagiti instrumento a naaddaan iti tunggal numero (null Ti rest ket iti Credits and Sats, a kas iti panangmatmat dagiti balanse. key Napateg ti key a saan a makakita iti salun-at.

Reaksiona

{
  "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"
  }
}
Status ititi
401Ti key ket saan, ket inaramid, ti inaramid, ti inaramid, ti inaramid.

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

Nagpateg a metodiko

Kasano a maaddaan iti panagrang-ay, ken ti limitasion. Lightning isu ti tunggal metoda.

GET https://nymbot.ai/api/v1/topup/payment-methods Ket saan a nangaramid iti key.

Ti top-up ket ti 10 a 1,000,000 a sats; ti Pro top-up ket naaddaan iti ad-adu pay iti maysa a Pro credit, para iti 100 sats. bulk_bonus Kuna ti extra credit iti bigger top-ups, kas iti app: 10%, 15% wenno 20% iti standard top-ups manipud 500, 1,000 wenno 5,000 sats, ken iti Pro top-ups manipud 5,000, 10,000 wenno 50,000 sats.

Reaksiona

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

Naaddaankami iti Lightning

Adda pay laeng ti sumagmamano a makisarita iti maysa a kasayaatan a kasayaatan a kasayaatan. Kitaen dagiti ladawan. Naaddaankami iti credit.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning Naaddaankami iti API Key.

Campo titiNaaddaankamiKitaen dagiti ladawan.
amountNumero tiWenIsu laengen ti, in currencyNabautisaran ti sumagmamano iti sats.
currencyString itiKetSATS Kitaen dagiti ladawan. USD ti BTCDollari a konverted iti current price ti Bitcoin.
tierString itiKetpro Kitaen dagiti ladawan. standard: iti maipapan iti balanse ti kredito.

Ti standard a credit ket 10 sats ken a Pro credit 100 sats, plus dagiti bonus a bulk; credits Adda pay laeng ti sumagmamano a sumagmamano.

Reaksiona

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
Status ititi
400Kitaen dagiti ladawan. (unsupported_methodMaanadantayo dagiti kabaketan a pagsasaotayo (unsupported_currencyTi maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua ni Abraham.amount_too_small(Tumaudto dagiti sumaganad a saludsod.amount_too_largeDaytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.amount_out_of_range).
429Agtawenak idi iti 120 a tawen ti napalabas a tawen (rate_limit_exceededti Retry-After).
502Maanadantayo dagiti kabaketan a pagsasaotayo (invoice_unavailableti 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);

Nagturong iti top-up.

Inlawlawagmo no ania ti inlawlawag ti inlawlawag ken, saankayo, inlawlawag ti credit. Checking isu ti inlawlawagna, saankayo nga inlawlawagna, check until the status is creditedNapateg a check it again ngem sigurado: ti kredito ti panagturay, saan a kaduana ti panagturay.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - ti kaadu ti key manipud iti nym nga inaramid ti invoice.

status ti pending (Nakaadantayo dagiti kabaketan a pagsasaotayo) paid Ket, inton napudoten ti init, ti mana a nabati iti daga marunawen. credited Isu ket pimmusay idiay asideg ti Edinburgh. expired Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.

Reaksiona

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
Status ititi
400Ti id ket saan a 64-karakter nga id iti creation call.
404Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.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);

Umadawtayo iti historia

Ti maysa a rida para iti solicitation: ti ania a modelo, ania a token ken ania ti costna. Ti saan a prompts wenno answers ket naidumduma, saan a saan a naidumduma. Ti rida ket naidumduma iti 90 nga aldaw, ti maudi a naidumduma.

GET https://nymbot.ai/api/v1/queries/history — ti kaaddaan iti API key, a makita ti maysa a requests, wenno a Agbiruk iti peticion. Napateg ti pammadayawna, ta saan a makita dagiti dadduma.

Campo titiNaaddaankamiKitaen dagiti ladawan.
pageAgbiruk iti Query.KetTi default ket 1, iti maximum a 1,000; ti maysa a panid ket 400 invalid_value.
page_countAgbiruk iti Query.KetAgtawenak idi iti 20 a tawen, agtawenak idi iti 100.
start_date
end_date
Agbiruk iti query.KetTi ISO 8601 ket addaan iti data.
modelAgbiruk iti query.KetNapateg ti model.
typeAgbiruk iti query.Ketchat, responses, messages, image, video, speech, transcription ti embedding.
all_keysDaytoy ket isu ti Query.KetAddaan iti key: true Naaddaankami iti maysa a pammadayaw a pammadayaw.Default false.
key_idAgbiruk iti query.KetIsu ket pimmusay idiay asideg ti Edinburgh. all_keys=trueKasta ti key.

Reaksiona

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

Kitaen dagiti ladawan.

Ti makina, mabasa ken revoking a key, ti account summary ken automatic top-ups, ket saan a makisarita ti API key. Makisarita ti asinami iti nym, tapno ti makisarita a key ti makisarita iti kaputotan, ngem saan a saan a makisarita iti kaputotan.

Ti app ket naaddaan iti daytoy: ti amin a Pimmanaw Napateg ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset ti maysa a paset.

Ti sinurat ket maysa a Nostr evento ti tipo 27235 (NIP-98), a nailawlawag iti base64-coded. Authorization Nagpintasen ti palabra Nostr Para iti front:

ti event

{
  "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 Daytoy ket addaan iti maysa nga addaan iti maysa a sebbangan, a ti maysa a sebbangan ket maysa a sebbangan.
  • method Daytoy ti HTTP Method.
  • payload Ti SHA-256 ket isu ti SHA-256 ti Raw Request Body, iti hex. POST ken PATCHDaytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.
  • created_at Naaddaankami iti 60 a segundo ti timek ti server.
  • Ngem saan a nagpateg a GET Daytoy ket addaan iti kaaduan kadagitoy no kalgaw.Isipudnona dagiti dadduma. nonce Napateg a dua a peticion a nairekord iti maysa a segundo.
  • Ti corpo ti sinurat a peticion ket addaan iti maximum a 64 KB, ken ti corpo ket nangisurat. Content-Type: application/json.

Naaddaankami iti missing event. 401 missing_nostr_authTi maysa a malalaknib, malalaknib, isu met laeng, wenno para iti sabali a URL, metodo, wenno body returns. invalid_nostr_authIbaga kadatayo ti Nasantuan a Surat a saantayo a madanagan. nostr_auth_replayedTi sinurat ket checked para iti pananglitan ti organo, ken ti tunggal address ti makaparagsak iti 30 a minuto (ti IPv6 address ket kalpasanna /64); ngem saan a makaparagsak iti 30 a minuto. 429 ti Retry-After.

Nalawag ti kuna ti Biblia: “Asinoman a mangay-ayat iti kinaranggas pudno unay a guraen [ni Jehova].https://nymbot.ai, https://nymchat.app Daytoy ket addaan iti kaaduan kadagitoy no kalgaw.Idi linuktan ti kaaduan kadagitoy no kalgaw. OriginDaytoy ket saan a nakakita.

Kasta ti secret key.

Ngem saan a naaddaan ti secret key ti NIM. nsecTi maysa ket addaan iti maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua ni Jehova.

Kas pagarigan, adda makaay-ayo iti maysa a paset ti maysa a pagilian. NOSTR_SECRET_HEXDaytoy ket addaan iti maysa a sebbangan. Nagpintasen Daytoy ket addaan iti maysa a command-line tool, a ti maysa ket maysa a nsec o hex key. sha256sum Addaan iti 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");
}

Agbiruk iti account.

Kas iti app’s API sheet ti ipakita: ti publiko a key, dua a balanse, innem a keys ti aktibo (non revoked wenno umad-adu), ken ti Automatiko ti top-up. Nalainganna dagiti dadduma. null Ngem saan a ti server ket inaramidda.

GET https://nymbot.ai/api/v1/account Naaddaankami iti Agbiruk iti peticion..

Reaksiona

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

Nalaing dagiti keys.

Napateg dagiti pangulo ti pangulo ti app. Naaddaankami iti Agbiruk iti peticion.Ti tunggal key ket returns iti daytoy a formulario, iti times iti ISO 8601 ken sumagmamano iti sats:

Objektona iti

{
  "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 Saan a maaddaan ti key, ket saan a maaddaan ti key, ngem saan a maaddaan ti key.

Napateg dagiti keys

GET https://nymbot.ai/api/v1/keys Naaddaankami iti

Campo titiNaaddaankamiKitaen dagiti ladawan.
include_revokedDaytoy ket isu ti Query.KetNapalalo ti inaramidna.Default. false.

Reaksiona

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

Naaddaankami iti key

POST https://nymbot.ai/api/v1/keys Naaddaankami iti regreso. 201.

Campo titiNaaddaankamiKitaen dagiti ladawan.
nameString itiWen1 agingga iti 40 a karakter, naaddaan iti dadduma pay a active keys (ignoring case).
limit_satsNapategdaKetNagsaludsodda iti maysa a pasamak, ket inaramidna ti 1.
reset_periodString itiKetdaily, weekly ti monthlyNaaddaankami limit_satsNgem saan a maipakitatayo ti kaputotan a saan a maipakitatayo ti kaputotan.
expire_atNapateg ti integer.KetIdi naaddaan ti key: ti ISO 8601 a oras, wenno milisegundas manipud idi 1970.

Agtawenak idi (2011)

{
  "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"
  }
}
Status ititi
400Nalaing ngamin idiay ayan ni Insan Crist ket isu a sabali dayta isemmo.duplicate_nameTi maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua ni David. (unknown_parameterMaanadantayo dagiti kabaketan a pagsasaotayo (too_many_keys).
429Ti maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua ni David (rate_limit_exceededti 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);

Kitaen dagiti ladawan.

GET https://nymbot.ai/api/v1/keys/{id} Naaddaankami iti

Naaddaankami {"data": {…}} Isu ket isu ti objekto, wenno 404 key_not_found Ngem saan a naaddaan ti 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);

Naaddaankami iti key

PATCH https://nymbot.ai/api/v1/keys/{id} Naaddaankami iti

Addaan iti name, limit_sats, reset_period ken expire_atNaaddaankami iti maysa a key. null Daytoy ket addaan iti kaaduan kadagitoy no kalgaw, ket addaan iti kaaduan kadagitoy no kalgaw. (400 key_revokedNaaddaankami iti {"data": {…}} Ngem saan a naaddaan ti key object.

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

Napateg ti key.

DELETE https://nymbot.ai/api/v1/keys/{id} Naaddaankami iti

Naaddaankami iti daytoy a list, saan a naaddaankami iti list. revoked_at Ngem saan a makita ti include_revoked=trueTi panagturay ket addaan iti lima a tawen a mangparegta iti panagturay.

Reaksiona

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

Daytoy ti NWC Auto-top-up.

Kas pagarigan, adda makaay-ayo iti panagrang-ay iti panagrang-ay iti panagrang-ay iti panagrang-ay. Agbiruk iti peticion..

Kasano a nagtrabaho: kalpasan ti inlawlawag ti API iti balanse a pimmanaw a pimmanaw, no isu ti balanse ket naparegta iti pimmanaw, inlawlawag ti Nymbot iti inlawlawag ti sumagmamano a top-up, inlawlawag ti wallet iti pagbayadda, ken inlawlawag ti credito. Inlawlawagna iti maximum kada 5 a minuto para iti tunggal niam ken balanse, tapno maaddaan ti inlawlawag iti wallet. Inlawlawagna iti app ket inlawlawagna ti inlawlawagna. Ti oras ken dimensiona ti naparegta a top-up, ken ti naparegta a error, adda iti settings; no ania ti inlawlawagna iti inlawlawagna, inlawlawagna ti inlawlawagna. Ti top-up ket Kredito iti.

Ngem saan a naaddaan iti wallet.

Ti Nymbot ket naidumduma iti encrypted ken saan a nausar iti pagbayad ti maysa a top-up invoice, ngem ti panangidumduma a koneksiyon ket para iti daytoy, babaen ti maysa a gasto a budget iti wallet, tapno maaddaan ti maysa a numero a pagbayadda. pay_invoice.

Agbiruk iti wallet.

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Naaddaankami iti

Campo titiNaaddaankamiKitaen dagiti ladawan.
nwc_urlString itiWenNaaddaankami iti link, begin. nostr+walletconnect://Ti Nymbot ket addaan iti wallet. get_info Ket, inton napudoten ti init, ti mana a nabati iti daga marunawen.
threshold_satsNapategdaWenNagpatingga ti sumagmamano a nagpatingga iti nasurok a 1,000 a tawen.
topup_satsNapategdaWenAgtawenak laeng iti 1,000,000 a tawtawenak.
tierString itiKetpro Kitaen dagiti ladawan. standard: ti balanse a makita ken ti top up.

Reaksiona

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
Status ititi
400Maanadantayo dagiti kabaketan a pagsasaotayo (invalid_nwc_urlDaytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.nwc_unreachableMaanadantayo dagiti kabaketan a pagsasaotayo (nwc_rejectedMaanadantayo dagiti kabaketan a pagsasaotayo (nwc_missing_permission(Tuladenyo ti bagiyo tapno maammoanyo no pudno met laeng nga agbibiagkayo iti pammati.)
501Ti maysa a pagarigan ket ni Eliezer a nakaitalkan ti adu a sanikua (nwc_unavailableIpapaupana ketdi ti kaaduan kadagitoy no kalgaw.

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

Kitaen dagiti ladawan.

GET https://nymbot.ai/api/v1/nwc-auto-topup Naaddaankami iti

Naaddaankami iti maysa a objekto, a connected: false Kitaen dagiti ladawan. null Ngem saan a naaddaan ti sumagmamano a kabsat, saan a naaddaan ti kabsat.

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

Disconnect iti

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Naaddaankami iti

Naaddaankami iti maysa a kabsat, saan a naaddaankami iti maysa a kabsat.

Reaksiona

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

Ngem saan a pay laeng ti key.

Ti fixed-price endpoints ket mabalin a pagbayad iti maysa a request iti maysa a tiempo iti Lightning, saan a saan a key, saan a account ken saan a balanse: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations ken POST /embeddingsTi chat, Responder, ken Messages ket mangted iti maysa a key. Ti request a mangted iti maysa a key ket nairuar iti saldo kas iti normal; ti pagbayad iti flow ket inusar idi awan ti key a nairuar.

Nymbot kuna ti dua a bersion ti maysa a idea, manipud iti maysa a backend: ti Lightning Labs. Agtawenak idi 402. Kitaen dagiti ladawan. LSATAddaan iti IETF Pagannurotan Ti HTTP authentication ket addaan iti lightning Nagpateg a charge Apay a saan a saan a saan a saan a saan a saan a saan a saan a saan.

Addaan iti server.

Ti pagbayad ket saan a nangikabil iti key. API_L402_SECRET Addaan iti 32 a byte, a hex (64 a karakter) wenno base64 (44). openssl rand -hex 32Ngem saan nga agturay ti agturay, agturay ti agturay iti agturay iti agturay. API_L402_SECRET_PREVIOUS Para iti maysa nga aldaw: kadagiti credentials, status URLs, ken dagiti challenge a nairekord iti dayta, agtrabaho agingga a maaddaan.

Addaan iti challenge

Agbiruk iti peticion no. Authorization Ngem saan a naaddaan ti inaramidna, saan a naaddaan ti 402 Payment Required iti in-facture para iti exact what that request costs: ti sama a price a key would pay, a konverted iti 10 sats a standard credit wenno 100 sats a Pro credit ken a raunded agingga iti intero a sat (minimo 1 sat, ken iti minimum a 0.05 credit minimum). WWW-Authenticate Addaan iti daytoy a problema:

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

Pagbayadda iti request Daytoy ket addaan iti base64url JSON. {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Napateg ti problema iti endpoint, ti Content-Type (ti media a ti tipo ken, para iti multipart, ti limitasion) ken iti SHA-256 ti eksakto a body bytes ti inaramidna, ket mangidadael iti 15 a minuto. IDIOMA iti Inlawlawagna: Sama ti Content-Type Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw./images/edits, /audio/transcriptions, /audio/translationsTi kaaduan a HTTP a libraria ket nalawag a limitasion a bagim iti ad-adu pay a coding a formulario.

Ti IPv6 address ket addaan iti 30 a challenge a minuto (ti IPv6 address ket addaan iti intero a /64). Dagiti requests a ti address ket saan a maaddaan iti 10 a minuto, ken adda ti total a cap kadagiti challenge a problema ti Nymbot iti amin a address; ti requests a refused before a challenge is made (p.e. a body that is not valid JSON) ket saan a maaddaan iti dayta. 429 ti Retry-AfterTi pagbayad a endpoints a nangipadala ket saan a key wenno credential ket kalpasanna agpatingga iti general limit ti 120 no authenticated requests a minute per address. Content-Type Daytoy ket application/json ( iti multipart/form-data Isu ket pimmusay idiay asideg ti Edinburgh. 415 Kimmaro la ket ngarud ti an-annayenna.

Ti embeddings ket naipaay manipud kadagiti estimate ti tokens iti input, iti 1.5× margin, gapu ta ti real count ket maaddaan ngem. Nagpatingga ti token..

Addaan iti pagbayadda

Kasapulantayo ti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmatmo iti panangmat

Schema ititi header
Agtawenak idi 402.Authorization: L402 <macaroon>:<preimage> (LSAT Kitaen dagiti ladawan.
PagannurotanAuthorization: Payment <base64url JSON>Addaan iti JSON. {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Ti pagbayad a request ket maaddaan iti maysa a key, agsipud ta ti nymbot Ti objekto ket saan a balanse a fields: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}No isu ti X-Nymbot-Balance-Sats Nagpateg a pagbayad iti pagbayad iti sistema ti Pagbayad ket saan a Payment-Receipt Napateg ti header (base64url JSON with the challenge id, ti payments hash as reference, status ken timestampTi pagbay-an ket saan a naaddaan iti daytoy a pammadayaw, ket saan a naaddaan iti historia ti pammadayaw.

Status ititi
402 payment_already_usedKas iti pagbayad iti maysa a solicitation, ti reaksion ket maysa a challenge para iti daytoy a solicitation, kas ti maysa a client a cache ti maysa a credential (ti maysa a credential). lnget Naaddaankami idiay Malakanyang idiay Malakanyang.
402 payment_mismatchDaytoy ket addaan iken ti kaaduan kadagitoy no kalgaw. Content-Type Kas pagarigan, adda makaay-ayo iti pammati, wenno pay laeng ti inaramidna iti dayta a petición. Nagpatingga ti token. (refund_token ken refund_sats Addaan iti cuerpo.
402 payment_expiredAgtawenak idi iti 15 a minuto manipud iti challenge. Napateg a challenge. No ti preimage naaddaan ti pagbayad, ti pagbayad ket naaddaan iti bagina. Nagpatingga ti token. (refund_token ken refund_sats Daytoy ket addaan iken ti kaaduan kadagitoy no kalgaw.
401 invalid_preimageTi preimage ket awan ti hash iti pagbayad ti invoice. Ti pagbayad ket saan a nausar.
401 invalid_payment_credentialTi credential ket malformado, ti mabasa kalpasan ti inaramidna ti Nymbot, wenno ti nagan a pagbayad a hash ti Nymbot ket inaramidda ti inaramidda.
429 rate_limit_exceededTi nasurok a 30 a credentials wenno keys a nangaramid iti verification ket naidumduma manipud iti daytoy a address iti maysa a minuto, wenno ti maysa a refund token ket naidumduma iti agarup 60 a minuto. 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"));

Napateg dagiti customer iti mppx Napateg a pagbalinan ti pagbalinan iti pagbalinan; agpategda iti endpoint ken inaramidda ti pay.

Video ti

Pagbayadda iti POST /videos Respondona 202 Kas iti maysa, plus a status_url: GET Naaddaankami iti maysa a trabaho, saan a naaddaankami iti maysa a trabaho, saan a naaddaankami iti maysa a trabaho.

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

Pimmanaw ti refund_token Daytoy ket addaan iti kaaduan kadagitoy no kalgaw. (GET /api/v1/l402/refunds Respondona "status": "pending"Daytoy ket addaan iti kaaduan kadagitoy no kalgaw. refund_sats Ti panagballigi ket addaan iti panagballigi ken panagballigi ket addaan iti panagballigi ken panagballigi.

Impanna iti

No awan ti pagbayad a request ket inlawlawag ti provider ti Nymbot para iti intento, ti pagbayadda ket inlawlawag ken ti error a nagsayaat, charged_satsIsu ket pimmusay idiay asideg ti Edinburgh, ken kadua met idi ti pamiliana. Nagpatingga ti token. Addaan iti pagbayad:

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

Daytoy ket addaan iti kaaduan kadagitoy no kalgaw.Isu ti kaaduan kadagitoy no kalgaw. nymbot Napateg a transcription ti naudi a lenguahe a saan a maaddaan iti ad-adu ti file ti naudi para iti naudi a lenguahe ti file ti naudi a naudi a 30 a minuto, ken ti diferensiada iti naudi a lenguahe ti naudi a naudi a token; no saan a naudi a naudi a 30 a minuto, ti naudi a naudi a naudi a naudi a 30 a minuto. 413 Daytoy ket addaan iti kaaduan kadagitoy no kalgaw.Idi linuktan ti kaaduan kadagitoy no kalgaw.

Ti backup token ket maysa a random 256-bit a code. Ti Nymbot ket mangisurat iti hash, ket agtawen iti 30 nga aldaw.

  • Pay iti dayta. Kitaen dagiti ladawan. Authorization: Bearer REFUND-… Nalawag ti kuna ti Biblia: “Asinoman a mangay-ayat iti kinaranggas pudno unay a guraen [ni Jehova].”refund_token_sats iti nymbot Napateg a makisarita ti sumagmamano a sumagmamano a sumagmamano. 402 refund_insufficientDaytoy ket addaan iti kaaduan kadagitoy no kalgaw.
  • Napukawanna iti GET /api/v1/l402/refunds Ngem saan a nagpateg a nagpateg {"sats": 237, "status": "open", "expires_at": "..."}.
  • Ti maysa a token ket nausar iti 60 a minuto.
  • Naaddaankami iti NIM. Napalalo iti Pimmanaw ti regalo Napateg ti app, iti call. POST /api/v1/l402/refunds/redeem ti a Agbiruk iti peticion. ken {"refund_token": "REFUND-...", "balance": "standard"} ( iti "pro"Ti intero a kredito ket nalawag iti salun-at (10 sats iti standard, 100 iti Pro); sats a saan a maaddaan ti intero a kredito iti token para iti API request.

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"

Reaksiona

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