Holo i ka ʻike
Hoʻi i Nymbot

kahua ʻike Nā mea kūkulu polokalamu

Ka loaʻa kālā, nā hoʻopuna kālā, a me nā kī

E nānā i kāu mea i loaʻa nei, e hoʻopukapuka ma luna o Lightning, e hoʻopukapuka pololei mai kāu ʻoe ponoʻī wallet, e nānā i ka kumuwaiwai o kēlā me kēia ʻimi, a e hoʻomalu i nā kī mai ka kōkua polokalamu.

Ke nānā nei i ka loaʻa

O nā kālā i loaʻa i ʻōlua a me ka nui o ka nui o kēia pūʻolo i hoʻohana ʻia.

GET https://nymbot.ai/api/v1/credits/balance — pono i ka API key. POST lawe pū nō, no nā mea kūʻai e ʻaeʻae nei.

balance He nui paha ka ʻelua pila pili pū ma ke kālā i ke kumu kūʻai Bitcoin i kēia manawa, no nā mea hana e ʻāpana ai i kekahi helu wale nō (null inā ʻole hiki ke heluhelu ʻia ka ʻuauhau). ʻO ka nui loa ʻia, he kredite a me nā sats, ʻo ia ke ala e mālama ʻia ai nā loaʻa loa. key wehewehe i ka leota i nānā ai. He leota i hiki i kona pahuhopu hiki loa ka mea e nānā ai i ka loaʻa.

A'ohe mea pane

{
  "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"
  }
}
KāleleʻAeʻe?
401Ua nele ka pūhea, ʻaʻole i maopopo, ua wehe ʻia, a i ʻole ua loaʻa ka loaʻa o ka wā.

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

Nā ala kālā ʻana

Pehea e hoʻopunamanaʻi ai, a me nā palena. ʻO Lightning ka ʻano wale nō.

GET https://nymbot.ai/api/v1/topup/payment-methods — ʻaʻole pono he pohiʻena.

ʻO ka hoʻopukapuka ʻana he 10 a hiki i ka 1,000,000 nā sats; ʻo ka hoʻopukapuka Pro, pono e kūʻai i koke kapa ʻoi loa he kumu Pro kahi, no laila e hoʻomaka ana ma nā 100 nā sats. ʻO nā loea i ka hola e mālama ana i ka ʻauinalā o ka Bitcoin. bulk_bonus haʻiupau i ka loaʻa ʻē aʻe o ka pūnaewele ma nā mea hoʻopukapuka nui aʻe, e like me ka hola i loko o ka polokalamu: 10%, 15% a i ʻole 20% hou ma nā hoʻopukapuka maʻamau mai 500, 1,000 a i ʻole 5,000 sats, a ma nā hoʻopukapuka Pro mai 5,000, 10,000 a i ʻole 50,000 sats.

A'ohe mea pane

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

Hoʻopukapuka ʻana ma luna o Lightning

He invoice Lightning kēlā e hoʻemi ana i ka pūnaewele i ka nym e noho nei ke kī, e kākau i ka uku mai ana mai kēlā me kēia pūnaewele Lightning, a e ʻo ia Nānā i kēia kiaʻi ʻia ka kākoʻo kālā.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning — pono i ka API key.

MāheleʻOleloPonoKāʻano
amountheluʻAePehea ka nui, ma currencyHe helu pololei no nā sats.
currencyleleʻAʻoleSATS (ka mea kumu), USD aʻole BTCKe hoʻololi ʻia nā dola ma ke kumuhana Bitcoin o kēia manawa.
tierleleʻAʻolepro (ka mea kapa ʻia ʻia) a standard: he aha ka loaʻa e hele ai ka credit.

He kumu kōkua maʻamau ʻo 10 sats a he kumu kōkua Pro ʻo 100 sats, me ke kūʻai nui ʻana; credits heaheo ka mea e hoʻemi ana kēia invoice.

A'ohe mea pane

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
KāleleʻAeʻe?
400He ala hou ma ke ala (unsupported_method), he kālā ʻole i maopopo ʻia (unsupported_currency) a lālā, he nui i nele, a he nui i lalo o ka nui loa ʻole (amount_too_small), he nui aʻe i loko o nā 1,000,000 sats (amount_too_large) a i ʻole i loaʻa mai e ka Lightning wallet (amount_out_of_range).
429He nui aʻe i ka ʻumu 60 mau pepa uku no kēia inoa, a i ʻole he 120 mai kēia panahelena, i loko o ka hola ʻekahi (rate_limit_exceeded, me Retry-After).
502ʻAʻole hiki ke hana i kekahi ʻinvoika i kēia manawa (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);

Ke nānā nei i kahi hoʻopuka kālā

Nānā inā ua uku ʻia ka ʻākoakoa a, ke uku ʻia paha, hoʻemi i ka kākoʻo. ʻO ka nānā ʻana ka mea e kākoʻo ai, no laila ma hope o ka uku ʻana, nānā no ka manawa a hiki i ka ʻāpana... creditedE nānā hou i hope he pololei ka hana: e loaʻa ana ka kālā i ka manawa ʻekahi, regardless no ka nui o kā ʻoe nānā ʻana.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — pono e loaʻa kahi pākaukau mai ka inoa i hana i ka ʻākoakoa.

status he pending (ʻaʻole i uku ʻia), paid (i uku ʻia, akā ʻaʻole i loaʻa; e nānā hou), credited (ma kou pūlā) a i ʻole expired (ʻaʻole i kākoʻo ʻia i ka manawa). He mau luna pono kēlā mau papa loaʻa no ka lūʻau e hoʻoponopono ai i ka papa loaʻa.

A'ohe mea pane

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
KāleleʻAeʻe?
400ʻAʻole ka id o ka ʻole ka id 64-helu mai ka ulu ʻana o ka ʻoluʻolu.
404ʻAʻole he bilu ma o kēlā inoa ʻukauka no kou inoa nanea (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);

Ka moʻolelo nānā ʻana

Lāuna kikoʻī no kēlā me kēia ʻimi: ka mea i hana ʻia, ka mea hana ʻia, ka nui o nā token a me kona kumuhana. ʻAʻole mālama ʻia nā nānā ʻia a i ʻole nā pane, no laila ʻaʻole e hoʻihoʻi ʻia kēlā me kēia. E mālama ʻia nā lāuna no nā lā 90, ka mea hou loa ma mua. ʻO ka pūnaewele i hiki i kona piko ka hiki ʻana i ka heluhelu ʻana i kona moʻolelo.

GET https://nymbot.ai/api/v1/queries/history — e pono ai kekei API, e ʻike ana i kona mau noi, a i ʻole he olelo i ʻōlelo i hōʻike ʻia mai kou inoa huna, i ka ʻike ʻia ai nā puka a pau.

MāheleʻOleloPonoKāʻano
pagehelu (nānā)ʻAʻoleKumu 1, ka nui loa ʻo 1,000; he ʻaoʻao ʻoi loa ʻo ia i ʻole 400 invalid_value.
page_counthelu (nānā)ʻAʻoleNā papa i kēlā me kēia ʻaohelo. Ka ʻole ʻo 20 ka mea i hoʻomaka ʻia, a i mea nui ʻo 100.
start_date
end_date
lālā (nānā)ʻAʻoleNā lā a i ʻole nā manawa ISO 8601.
modellālā (nānā)ʻAʻoleHele wale kēia moʻolelo.
typelālā (nānā)ʻAʻolechat, responses, messages, image, video, speech, transcription aʻole embedding.
all_keysboolean (nā nānā ʻana)ʻAʻoleMe nā pohaku: true hoʻohui i kēlā me kēia kiʻi o ka inoa like. Ka loaʻa maʻamau false.
key_idlālā (nānā)ʻAʻoleMe kēia olele i haʻi ʻia, a me kēia ʻoe me all_keys=true: kēia wale nō ke ki.

A'ohe mea pane

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

Ke ʻimi ʻana i nā noi i ka aka ʻana

ʻO ka hana ʻana, ka loli ʻana, a me ka hoʻopau ʻana i nā pākaukau, ka hōʻuluʻulu akaʻo, a me ka hoʻopukapuka ʻana ma ke ʻano pololei ʻaʻole e pono i kahi pākaukau API. He inoa (signature) mai kou nym kā lākou, no laila, inā hāʻule kahi pākaukau, hiki iā ia ke hoʻohana i ka nui i loaʻa i kona kauka, akā ʻaʻole hiki iā ia ke hana i kekahi pākaukau hou a i ʻole ke hiki i kona nui i luna.

E hana kēia polokalamu iā ʻoe: ka mea a pau i loko o kona API loea kēia mau endpoint. He kēia ʻaoʻao wale nō e hoʻokele ai i nā pīkini mai kou kōkua ponoʻī.

ʻO ka waihona he mea hana Nostr ʻano 27235 (NIP-98), i hoʻouna ʻia ma ke ʻano base64 i ka Authorization kumu me ka huaʻōlelo Nostr ma mua:

Ka hana nui

{
  "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 He aha ka URL holoʻokoʻa o ka noi, me ka hoʻohui ʻia ʻana o ka pāʻuna nānā, e like pē me ka loaʻa ʻia ʻia.
  • method ʻo ka hana HTTP.
  • payload ʻO ka SHA-256 o ka ʻōlelo hōʻike kumu, ma ka hex. He mea pono ia ma luna o POST a PATCH, a ʻo ka mea e hoʻouna ʻia nei, pono e like pū me ka mea i hāpale ʻia i kēlā me kēia byte.
  • created_at pau pono i loko o nā sekoke 60 mai ka manawa o ka pūnaewele.
  • Hana pākahi ʻo iaʻuʻu aʻe ʻo ia, a GET ua hoʻohui ʻia, no laila ʻa ʻole hiki ke hoʻihoʻi ʻia kahi ʻulaʻou i ka mea i loaʻa ʻia. ʻO ka unuhi ʻana i kekahi ʻulaʻou hou no kēlā me kēia ʻike ʻōlelo. Hoʻemi i kekahi nonce hoʻok标记 me kahi waiwai loli wale no ka mea, ʻo nā unuhi ʻelua i huakaʻi ʻia i ka hola pōmaikaʻi me kaumaha, e loli nō lākou.
  • Hiki ke loaʻa i ka ʻuhi o kahi ulu ʻia ʻia ke kūʻai i ka nui ʻana i ka 64 KB, a pono ke loaʻa kahi ʻuhi Content-Type: application/json.

He hana hewa i nalo ʻia ka hana e hoʻi mai ana 401 missing_nostr_auth; ʻo kekahi i hana ʻole i ka pololei, i hōʻihi ʻole i ka pono, i kahiko loa, a i ʻole no kahi URL, ʻano, a i ʻole kumu ʻē aʻe, e hoʻi mai ana invalid_nostr_auth, me ka manaʻo i loko o ka leka; he mea hoʻohana ʻia hou nō ka mea i hoʻohana ʻia mua e hoʻi mai ana nostr_auth_replayed. E neʻe ʻia ʻia kahi API key i kēia mau endpoint. E nānā ʻia ka inoa (signature) a i ʻole ka ʻano i mua ʻole e helu ʻia ka ʻelomi, a hiki i kēlā me kēia ʻāpana ke kūpaʻa i ka pēhea ʻia ʻana i ka hola 30 i ka minaka (ua pili ʻia kahi ʻāpana IPv6 me kona /64 holoʻokoʻa); ma hope o kēlā, e loaʻa... 429 me Retry-After.

Hiki i nā pāpaho nānā ke kāhea ʻana i kēia mau endpoint mai nā ʻaoao ponoʻī o Nymbot wale nō (https://nymbot.ai, https://nymchat.app me lā me ko lākou mau pahu i lilo ai. ʻO kekahi ʻaoʻao ma kekahi wahi ʻē aʻe ʻole e loaʻa iauna nā ʻōlelo hoʻohui CORS, no laila ʻole hiki iā ia ke heluhelu i ka mea i hoʻouna ʻia mai lākou. Nā polokalamu a me nā polokalamu maoli, ʻaʻole lākou e hoʻouna i Origin, ʻa ʻole i kanāwai.

Kou pīʻāpā huna

Pono ka ʻimi ʻana i ka mea kī pilikino o kou inoa ʻimeli (ka nsec), i ke koho nei i mea a pau: kou pilina, kou moʻolelo a me kou loaʻa kālā. Hoʻoili wale i loko o kekahi script ma kekahi ʻano ʻaoʻao ʻo ia ʻoe e kūpaʻa ai, heluhelu mai ma ka environment ma mua o ka kākau ʻana i loko o ka faila, a e kūpaʻa i ka app inā hiki iā ʻoe.

Ke kūkulu nei kēia mau kōkua i ke ʻula. ʻO nā laʻaukoea i hiki mai ana ma kēia ʻaoʻao ka mea e hoʻohana ai. Kaila ka piko hunaʻokoa i ka piko i ka hex mai NOSTR_SECRET_HEX; ʻo ka mea cURL e hoʻohana nei ʻo ka ʻAe mea hana lālā-kāhea, e ʻae ia i kekahi nsec a i ʻole hex kī, a me sha256sum (ma 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");
}

Ka hōʻuluʻulu o ka loaʻa loaʻa

He aha kā lāʻaupapa API o ka polokalamu e hōʻike ana ma luna: kou pāʻena pololei, nā pūʻolo ʻelua, he aha ka nui o nā pāʻena e paʻa ana (ʻaʻole i hāʻule ʻia a i ʻole i loaʻa ka wā e kūpono ai), a me ka hoʻopunipuni pololei koho, a null i ka wā e ʻole ai ka papa ʻōpala e hāʻawi iā lākou.

GET https://nymbot.ai/api/v1/account — pono i he olelo i ʻōlelo i hōʻike ʻia.

A'ohe mea pane

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

Ke hoʻokele ʻana i nā pākaukau

Nā pahu ma hope o ka papa inoa pūnaewele o ka polokalamu. Pono iā lākou a pau he inoa ʻia ono ʻike ʻāpana. ʻO kēlā me kēia kiʻi e hoʻi mai ana ma kēia mau ʻano, me nā manawa i loko o ka ISO 8601 a me nā nui i loko o nā sats:

Kumu mea mea waiwai

{
  "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 He nui ka ʻike i ka ʻike ʻana i ka kī akā ʻaʻole ka hoʻohana ʻana i ia. ʻO ka kī pono i ka hāʻawi ʻia ʻana i ka mea hoʻokahi wale nō, i ka wā i hana ʻia ai.

Keenaʻimi i nā ki 🔑

GET https://nymbot.ai/api/v1/keys Kalima ʻia

MāheleʻOleloPonoKāʻano
include_revokedboolean (nā nānā ʻana)ʻAʻoleHoʻokolu i nā pākaukau i wehe ʻia. Ka pūʻolo. false.

A'ohe mea pane

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

ʻO ka hana ʻana i kahi pohaku

POST https://nymbot.ai/api/v1/keys — ʻoiaʻiʻo. Heia nā mea e tali mai ana 201.

MāheleʻOleloPonoKāʻano
nameleleʻAe1 a 40 mau helu ʻōlelo, ʻole paha e like me kāu mau pūnaewele hou aia i kēia manawa (haʻalele i ka ʻano ʻōlelo).
limit_satshelu pololeiʻAʻoleKe kākoʻo kākoʻo kākoʻo ʻana i ka nui o ka kākoʻo i nā sats, ʻo ia paha ʻo 1. ʻO ia paha ʻole ke kākoʻo ʻana i ka nui ʻole.
reset_periodleleʻAʻoledaily, weekly aʻole monthly. Makemake limit_satsE haʻalele ia no he pāpā ʻole e hoʻiia mai ana.
expire_atinoa a i ʻole ʻo ia he heluʻAʻoleI ka manawa e ʻole ai ka hana o ka kī: he manawa ISO 8601, a i ʻole nā milisekonas mai ka makahiki 1970 mai.

Pane (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"
  }
}
KāleleʻAeʻe?
400He inoa i nalowale ʻole ʻia a i mea ua lōʻihi loa; he inoa i loaʻa mua ʻia (duplicate_name); he pākuʻi ʻole he helu piʻi ʻole i kikoʻī ʻia ʻo ʻole he ʻeha ma luna o ka ʻeha ʻokahi; he manawa hoʻoponopono ʻole me kahi pākuʻi; he manawa pahala i ka wā i hala nei; he luna ʻole ʻole ka papa ʻike (unknown_parameter); a i ʻole 25 mau pohona hana nei (too_many_keys).
429He ʻoi aku ma mua o nā pīkini 60 i hana ʻia e kēia inoa, a i ʻole 120 mai kēia ʻelepani, i loko o kahi hola (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);

Heluhelu i kahi kī

GET https://nymbot.ai/api/v1/keys/{id} Kalima ʻia

Nā mea e hoʻi mai ana {"data": {…}} me ka mea kī, a i ʻole 404 key_not_found Inā ʻaʻole he pīkini kou e loaʻa ana i kēlā 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);

Hoʻololi i kekahi pohaku

PATCH https://nymbot.ai/api/v1/keys/{id} Kalima ʻia

E hoʻouna i kekahi o name, limit_sats, reset_period a expire_at, me nā kānāwai like me ka hana ʻana i kahi hola. null hoʻoponopono i kahi papa: ʻole ka pio, ʻole ka hoʻoponopono hou, ʻole ka pau ʻana. ʻO ka loli ʻana i ka manawa hoʻoponopono hou e hoʻomaka ai i kahi manawa hou ma ka zero. ʻAʻole hiki ke loli i kahi pāpā i hāʻawi ʻia ʻole (400 key_revoked). Hoʻi mai {"data": {…}} me ka mea kī hou ʻia.

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

Hoʻopau ʻana i kekena

DELETE https://nymbot.ai/api/v1/keys/{id} Kalima ʻia

Hoʻopau koke i ka pīkini, no ka loaʻa mau ʻana. Noʻonoʻo i ka papa inoa me revoked_at hoʻokomo ʻia, a hiki ke ʻike ʻia me include_revoked=trueʻO ka hoʻokuʻu ʻana i kekahi pīpīhau i hoʻokuʻu ʻia mua ʻo ia pēlā nō ka pane ʻana. ʻO nā pīpīhau 50 i hoʻokuʻu ʻia i luna loa wale nō ke loaʻa ʻia; ʻāʻole loa ʻia nā kahiko i ka wā e hoʻokuʻu ʻia ai kekahi pīpīhau ʻē aʻe.

A'ohe mea pane

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

Hoʻopili i kahi waiwai Lightning me ka Nostr Wallet Connect a hoʻopunipuni ʻia e Nymbot ka waiwai i ka wā e pau ai ka hoʻohana ʻana i ka API. He mau hoʻonohono like nō kēia i ka pepa API o ka polokalamu; kēia nā puka puka i loko pono ʻia. Pono nā mea a pau i ka olelo i ʻōlelo i hōʻike ʻia.

Pehea ia e hana ai: ke hoʻonāuna ʻia ka unuhi API ma ka pūnaewele i ko ʻoe i koho ai e nānā ai, inā ua haʻalele kēlā pūnaewele iho o kou kumu kūʻai, e hana i kekahi ʻunuhi ʻia e Nymbot no kou nui uku, e nānā i kou pūkena e uku ai, a e hoʻemi i ka uku. He mea hoʻopukupuku ʻia ia i ka ʻole o ka ʻekolu i nā minuke he umahana no kēlā nym a me ka pūnaewele, no laila ʻaʻole hiki i ka nui o nā unuhi ke hoʻopau i ka pūkena. ʻAʻole ka hoʻohana ʻana i nā polokalamu e hoʻomaka ai i kēia. ʻO ka manawa a me ka nui o ka uku i loaʻa i ka wā hope loa, a me ka hewa i loaʻa i ka wā hope loa, e loaʻa nei i nā loea; inā ua loaʻa ka uku ma hope o kekahi hewa, e nānā i kona ʻunuhi me ka hiki ʻana o ka hoʻopunamuna ʻana mea kūpono ia ia.

Aia ma mua o kou hoʻokoki ʻana i kahi pūnaewele wai loa

Ke kumu hoʻopili e loaʻa iā ia ka mea i ka mea e nīnau ai i kāu pūkeniuka e kākoʻo ai i ka nei. Nymbot hoʻohana i ka hūnā ʻia ʻana o ia mea a e hoʻohana wale ʻia no ka kākoʻo ʻana i nā bilu kākoʻo iho, akā hana i hoʻopili no kēia wale nō, me kahi kālā kākoʻo i loko o kāu pūkeniuka, i mea e loaʻa ai ka nui loa hiki ke kākoʻo ʻia he helu i ko ʻole ʻia e ʻoe. Pono ka pūkeniuka e kākoʻo i pay_invoice.

Ke hoʻopili ʻana i kekahi pūnaewele waiwai

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Kalima ʻia

MāheleʻOleloPonoKāʻano
nwc_urlleleʻAeKe lālā hoʻokoneʻi, e hoʻomaka ana nostr+walletconnect://. Naʻauao Nymbot e nānā ai i ka puku waihona no get_info ahi i ka hoʻ保存 ʻana ʻana, a hoʻohana i ka hūnā ʻana i ka ʻike.
threshold_satshelu pololeiʻAeHoʻopuna i ka loaʻa inā ʻoi aku ka ʻole o kēia mau sats. Ka ʻoi loa ʻo 1,000.
topup_satshelu pololeiʻAePehea ka nui e hoʻemi ai i kēlā me kēia manawa. 1,000 a hiki i ka 1,000,000 sats.
tierleleʻAʻolepro (ka mea kapa ʻia ʻia) a standard: ka loaʻa e nānā ai a e hoʻoponopono ai.

A'ohe mea pane

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
KāleleʻAeʻe?
400ʻAʻole he lālā hoʻopili (invalid_nwc_url); ʻaʻole i pane mai ka pūkena ma kona pūnaewae (nwc_unreachable) a i ʻole kūʻai i ka nānā ʻana (nwc_rejected); ʻaʻole hiki i ka lōkahi ke kālā i nā pepa loaʻa (nwc_missing_permission); a he nui i waho o nā loaʻa.
501ʻAʻole i hoʻonā ʻia nā hoʻokomo waiwai i kēlā me kēia manawa no kēia server (nwc_unavailable). Pono pēlā no nā ʻaoao ʻelua ʻimi ʻia.

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

Alekāpū ʻana i nā hoʻonohonoho

GET https://nymbot.ai/api/v1/nwc-auto-topup Kalima ʻia

Hāʻawi mai i ka mea pēlena like ʻia me ka hoʻopili ʻana, me connected: false me nā luna ʻehapi ʻē aʻe null Inā ʻaʻole i hoʻokoneʻi ʻia kekahi pūʻokoʻa. ʻAʻole e hoʻi mai pē ka lālā hoʻokoneʻi.

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

Kūʻai ʻana i ka lilo ʻana

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Kalima ʻia

Hoʻopau i ka lālā kī kānelike i hoʻumālama ʻia. ʻAʻole e hana hou i nā hoʻopukapuka ʻana. No ka ʻoiaʻiʻo, hiki iā ʻoe ke wehe i ka lālā kī kānelike ma luna o kou pūkeni.

A'ohe mea pane

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

Ke kākoʻo ʻana ma o nā ulu ʻia ʻole me ka ʻeke

Hiki ke uku ʻia nā hopena kiʻekiʻe kūpono no kahi ulu ʻia i kēlā me kēia manawa ma luna o Lightning, me ka ʻole o kahi puka, me ka ʻole o kahi akaunaka a me ka ʻole o kahi pūnaewele: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations a POST /embeddings. He ʻimi pono mau nō nā Kamaʻilio, nā ʻOluʻolu, a me nā>: Pūnaewele, inā loaʻa kekahi ʻimi, e pili ana ka uku i ka pūlua me ka noʻeau; e hoʻomaka wale ka ala uku inā ʻole he ʻimi i hoʻouna ʻia.

Nymbot e ʻōlelo ana i ʻelua mau ʻano o ka manaʻo pēnei, mai kahi pūnaewele hoʻokahi: o Lightning Labs' L402 (a me ka inoa kahiko pū kēia i loaʻa ai, LSAT) a me ka draft a ka IETF Ka uku Ka pololei o ka hoʻohana ʻana i ka ʻano hōʻoia HTTP me ka lightning ka manaʻo a me charge manaʻo. Hoʻohana i ka mea ʻoiaʻiʻo i ka mea e ulu ai kou mea kūʻai.

E ne'e ana i kou luna server ponoʻoe

ʻO ka uku ʻole i kahi pīkini, he mea nō ia i ʻike ʻia ma ka manawa he pāʻea wale nō ia API_L402_SECRET He ʻoi aku ma mua o nā byte 32 loli ʻole, ma ke ʻano hex (64 mau helu) a i ʻole base64 (44). Haku i kekahi me openssl rand -hex 32ʻO ka waiwai lalo a i ʻole ka waiwai hiki ke ʻike ʻia e hāʻawi i ka hoʻopau ʻana i ka mea hana a kākau pū i ka manaʻo no ka mea. No ka hoʻoweliweli ʻana i ia, lawe i ka waiwai kahiko i loaʻa i API_L402_SECRET_PREVIOUS no ka lā e like me: nā manaʻo hoʻoholo, nā URL o ka hiki ʻana a me nā pilikia i hana ʻia ma kona ʻisy e mau ana hiki i ka wā e loaʻa ai ka lehulehu ʻole.

Ka hana nui

Hoʻouna i ka noi me ka ʻole Authorization uluʻulu. Inā kūpono ia, ʻaʻole e hana kahi mea, a e loaʻa iā ʻoe 402 Payment Required me ka pepa uku no ka nui maopopo o ka uku o kēlā noiʻi: ka nui uku pēnei i ka mea e uku ai kekahi 'key', i hoʻolili ʻia ma 10 sats no ka 'standard credit' a i ʻole 100 sats no ka 'Pro credit' a i hoʻonui ʻia i ka hopena sat (ka ʻoi aʻe ʻo 1 sat, a me ka ʻoi aʻe ʻo 0.05 credit ka nui ʻole). ʻO ka pane e lawe ana i nā kolu WWW-Authenticate nā pilikia no ka pepa loaʻa pēlā:

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

Ka Kaʻuʻu ʻana i ka Pūmoney request he mea kumu JSON base64url kēia: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

He pilikia e pili ana i ka hopena, i ka Content-Type (ka ʻano media o ia a, no ka multipart, kona pāuna) a i ka SHA-256 o nā byte kūpono o ka kino i hoʻouna ʻia, a e noho ana no 15 minuke. Ma hope o ke kālā ʻana, hoʻouna i ka pāpaʻa like e noi hou: ʻo ia pēlā Content-Type me nā byte JSON pēlena, a i ʻole no nā hopena multipart (/images/edits, /audio/transcriptions, /audio/translations) ka mea pūʻulu like me ka pūʻulu kiʻi like me ka pale ʻāpana like. Ke koho ʻia e nā pahu HTTP hou kahi pale ʻāpana i kēlā me kēia manawa e hoʻopaʻa ʻia ai kahi pālua, no laila e hoʻopaʻa i ka ʻana i kapa ʻia he una a e hoʻouna i kēlā mau ʻikepili i loko o nā manawa ʻelua.

ʻO ia ʻana ʻo ia nōna mea hiki ke unuhi i nā ʻāpana (challenges) ʻimene 30 i ka minaka (hōʻike ʻia ka ʻana IPv6 ma ke ʻano he /64 holoʻokoʻa). ʻO nā unuhi i ʻaʻole ʻike ʻia ka ʻana, he 10 i ka minaka kikoʻī aʻe lākou, a he loaʻa nui nō pū kekahi no nā ʻāpana i hāʻawi ʻia e Nymbot ma nā ʻana a pau; ʻaʻole lawe ʻia i loko o ia inā lawe ʻia ka unuhi ʻaʻole i hāʻawi ʻia ka ʻāpana (no ka laʻana, inā ʻaʻole kūpono ka JSON). Ma hope o kēlā, ʻo ka pane ʻia ʻo 429 me Retry-After, i ke hoʻouna ʻia mua o ka heluhelu ʻana i ka kumu. ʻO nā hopuna i kahea ʻia me ka ʻole o kahi kiʻi a i ʻole kākoʻo me ka ʻole o ka ʻike, e loaʻa pū kekahi i ka nui kūlohelohe o ka 120 nā unuhi ʻole i ka minuke no kēlā me kēia ʻāpana. E nānā ʻia ka kākoʻo mua o ka heluhelu ʻana i ka kumu, a he unuhi i ka mea e Content-Type ʻaʻole ia application/json (a ʻo multipart/form-data no nā hoʻouna) ua kūʻē ʻia me 415 a me he ne‘ole loa he invoice.

Ke kumuwaiwai o nā embeddings he ka helu ʻana mai ka ʻano ʻike ʻia o nā token i loko, me ka 1.5× mea hoʻonui, no ka mea ʻaʻole ʻia ka helu maoli a hiki i ka hope loa. ʻO nā token i hoʻohana ʻia maoli kāu kākoʻo, a ʻo ka ʻāpana i ʻole i hoʻohana ʻia o ke kākoʻo e hoʻi mai ana ma ke ʻano he hoʻi mea loaʻa ka pūnaewale.

Hoʻouna ana i ke uku

E pilikia ka invoice me kekahi pūnaewae Lightning. E hāʻawi ana ka pūnaewae iā ʻoe i ka preimage, 64 hex characters. E ala ʻole e hoʻouna ai i ka ulu ʻoe me kekahi o kēia:

HoʻolālāKokua Kumu
L402Authorization: L402 <macaroon>:<preimage> (LSAT hana pū nō ʻoe)
Ka ukuAuthorization: Payment <base64url JSON>, ma hea ka JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

He noiʻi i uku ʻia he mea e pane ana e like pēlā me kekahi mea i hana ʻia me kekahi pūnaewele, akā ʻo ia ka mea e... nymbot ʻaʻole i loaʻa mau nā luna kālā i ka mea: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}, a me ʻole he mea ʻole X-Nymbot-Balance-Sats kokua. A he noi i ukuia me ka Papa Kumu ʻIke ʻOluokuloko e loaʻa pū kekahi Payment-Receipt palahea (base64url JSON me ka ʻōlelo hōʻike o ka challenge id, me ka payment hash ma ke ʻano he reference, status a timestamp). ʻAʻole pili nā unuhi uku i kekahi inoa, no laila ʻole lākou e hōʻike ʻana i loko o ka moʻolelo nānā ʻia.

KāleleʻAeʻe?
402 payment_already_usedʻO kēlā ʻaoʻao uku a pau, he uku ia no kekahi noi. ʻO ka pane kekahi pilikia hou no kēia noi, no laila ʻo ka mea kūʻai e mālama ana i kāna ʻikepili i ka wā kahiko (e like me lnget ke kumu wale nō e kālā hou ana.
402 payment_mismatchUa hāʻawi ʻia ka ʻikepili hōʻoia no kekahi ʻaoʻao ʻē aʻe, Content-Type a ka kino, a ʻoi aku ka uku ma mua o ka uku o kēia ʻōlelo i kēia manawa. He kūlana hou kēia no kēia ʻōlelo e hiki mai ana; inā liʻiliʻi loa ka uku, e hoʻi mai ana ka mea i uku ʻia e like me kahi hoʻi mea loaʻa ka pūnaewale (refund_token a refund_sats i loko o ka kino).
402 payment_expiredUa hala ʻoi atu i ka 15 minitua mai ka hoʻohāpana ʻana. He hoʻohāpana hou ke hiki mai me ia. Inā hōʻike ka preimage ua uku ʻoe, e hoʻi mai ana ka mea i uku ʻia e like me he a hoʻi mea loaʻa ka pūnaewale (refund_token a refund_sats i loko o ka kino), ʻole; ua hoʻohana ʻia kēlā mea kūpono ma hope.
401 invalid_preimageʻAʻole ka preimage e hāʻawi ana i ka hash o ka invoice. ʻAʻole hoʻohana ʻia ka uku.
401 invalid_payment_credentialHe hewa ka ʻimi ʻāpana, ua loli ma hope o ka hāʻawi ʻana a Nymbot, a i ʻole he inoa paha ia o kahi ʻimi kālā i ʻole i hāʻawi ʻia e Nymbot ma o kahi pepa uku. ʻAʻole e loaʻa kahi macaroon i loaʻa i Nymbot kahi ʻōlelo kūʻē, a i ʻole me nā ʻōlelo kūʻē kūʻē ʻia.
429 rate_limit_exceededHe 30 ʻoi aku ma mua o nā pūʻāʻawa a i ʻole nā pīkini i kūleʻa i ka hōʻoia ʻana i loaʻa mai kēia ʻaoʻao i loko o ka minaka kanavelua, a i ʻole ua hoʻouna ʻia kekahi pūʻāʻawa hoʻiʻole i ʻoi aku ma mua o ka 60 manawa i loko o ka minaka kanavelua. E kali i... 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"));

Poʻe mea kūʻai hoʻokumu ʻia ma luna o mppx me kahi ala Lightning e hoʻopau ai i ka pilikia i ka ʻAowai ʻana i ka ʻuve; e hoʻpointing i ka hopena a e allowa iā lākou e kākoʻo ai.

Nā wikiō

He uku ʻia POST /videos nā pane 202 pēlā me kekahi mea i kī ʻia, a me kekahi a status_url: GET ʻole ia kekahi ala e hiki ai ke mālama i ka hana. Ua inoa ʻia ia a e hana ana no nā hola 24, ma o ka mālama ʻana i ka hana.

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

E mālama i ka refund_token mai kēia pane: he ʻoia wale nō ke hōʻike ʻia ma kēia wahi. He pōʻole ia i ka wā e hana ai ka wikiō (GET /api/v1/l402/refunds nā pane "status": "pending"); inā lēlea ka hōʻike ʻole i ka uku, e loaʻa ana ka uku ma ia ia. Hōʻike ʻia e ka URL o ka waiwai refund_sats No kahi hana i hoʻiʻole ʻia ka kālā akā ʻaʻole i loaʻa ka hōʻailona, ʻaʻole hiki ke hōʻike i ka hoʻiʻole ʻia o ka kālā ma o ka URL o ka hiki ʻana o ka hana. ʻO ka nānā ʻana i ka hōʻailona, e hoʻoponopono pū ana i kahi hana i kūleʻa ʻole i ʻole i nānā ʻia e kekahi kanaka.

Nā hoʻoikaika kālā

Inā hāʻule kekahi noi i kālā ʻia a ua uku ʻia ʻo Nymbot e ka mea ʻoiaʻiʻo no ka hoʻāʻo, e mālama ʻia ka uku a e ʻōlelo ʻia kēlā ma ka hewa, me charged_sats, e like pēlena i kahi ʻōlelo pili ʻia. Inā hāʻule me ka ʻole o ka uku ʻana, e lawe ka hewa i he hoʻi mea loaʻa ka pūnaewale kūpono i ka uku ʻia ʻia:

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

He mau ʻana ʻole i hoʻohana ʻia e hoʻi mai ana i ka ʻano like pēlā: inā ulu ʻia ʻo nā kiʻi ʻelua a lilo kekahi i ka mea ʻole i kākoho ʻia, ʻo ka pane kūpono o nymbot ʻo ka mea kūʻokoʻa e lawe ana i kahi pūnaewele hoʻoulu no ka mea i nalowale; he unuhi e neʻe ʻole ai ka ujemena i ka wā mua, e hoʻohana ʻia ka uku no ka lōʻihi loa o ka faila (ʻaʻole e ʻoi aku ma mua o 30 minuke), a ʻo ka ʻikepili i loaʻa ma waena o ka lōʻihi maoli a me ka ulu ʻana, e hoʻi mai ana ma ke ʻano he pūnaewele hoʻoulu; inā ʻoi aku ma mua o 30 minuke, e lawe ʻia ʻia me 413 a me ka malu o ka uku pili loa eia mai. He mea e hoʻihoʻi ʻia e nā embeddings ka mea i loaʻa ʻole i ka nānā ʻana. ʻO ka mea i hāʻawi ʻia i ka video i lapaʻau ʻia, he hoʻihoʻi ia i ka token i hāʻawi ʻia i ka hoʻohaklama ʻana.

He holauna hoʻoikaika ʻo ia he kōkua 256-bit ʻole ʻia. Ke mālama wale ʻia e Nymbot ka hāʻawi pono, a e nalo ia ma hope o nā lā 30. He loaʻa iā ia kahi hoihoi sat, a hiki iā ʻoe ke:

  • E kālele me ia. Hoʻouna Authorization: Bearer REFUND-… ma nā hopena a pau i luna aʻe (kaona ʻia e ka OpenAI SDK ma ke ʻano he API key). He mea nā uku mai ka ʻikepili token a e noho ana ka mea i loaʻa i luna o ia (refund_token_sats i loko o ka nymbot mea hana). He kīwai i ʻoi aku ka uʻi ma mua o ka unuhi ʻana i nā pane. 402 refund_insufficient; he hapa ʻole i ke uku ʻia ʻole e hoʻihoʻi i nā sats i ka token pēlā pū.
  • E nānā i ia. GET /api/v1/l402/refunds me ka pūʻulu pū hoʻi mai {"sats": 237, "status": "open", "expires_at": "..."}.
  • Hiki ke hoʻohana ʻia he token i ka nui loa ʻo 60 mau manawa i ka minuke.
  • Move i loko o ka nym. Paʻaki i loko o E ʻimi kūʻai i ka makana i loko o ka Nymbot app, a ke kele ʻana POST /api/v1/l402/refunds/redeem me he olelo i ʻōlelo i hōʻike ʻia a {"refund_token": "REFUND-...", "balance": "standard"} (a ʻo "pro"). Hele koke ke kūleana i ka pūnaewale (10 sats kēlā me kēia ma standard, 100 ma Pro); nā sats ʻole e hana i kahi kūleana holoʻokoʻa e noho ana ma ka token no nā nānā API.

cURL

URL=https://nymbot.ai/api/v1/l402/refunds/redeem
BODY='{"refund_token":"REFUND-...","balance":"standard"}'
curl "$URL" \
  -H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

A'ohe mea pane

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