Gaa na ọdịnaya
Back na Nymbot

Isi ihe ọmụma Ndị na-arụ ọrụ

Ọdịdị, top-ups na keys

Nyocha ihe ị nwere, na-agba ọsọ Lightning, na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ.

Nyocha ego

Ndị abụọ gị ego, na ihe ọ bụla nke a keys cap na-eji.

GET https://nymbot.ai/api/v1/credits/balance Ị chọrọ a API Key. POST na-arụ ọrụ, maka ndị ahịa na-atụ aro ya.

balance bụ ndị abụọ ego na-agụnye na dollars na ugbu a Bitcoin price, maka ngwá ọrụ na-atụle otu nọmba (null Ọ dịghị ka price nwere ike ịhụ). The ọzọ bụ na credits na sats, nke bụ otú ego na-eme kachasị. key Ọ bụrụ na ị na-agba ọsọ ya, a na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ.

nzọụkwụ

{
  "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"
  }
}
ọnọdụmgbe
401The key bụ na-adịghị, unknown, revoked ma ọ bụ tupu.

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

Ịkwụ Ụgwọ Methods

How you can top up, na ụkpụrụ. Lightning bụ otu usoro.

GET https://nymbot.ai/api/v1/topup/payment-methods Ọ dịghị mkpa.

A top-up bụ 10 ka 1,000,000 sats; a Pro top-up kwesịrị ịzụta ọ dịkarịa ala otu Pro credit, otú ọ na-amalite na 100 sats. bulk_bonus na-agụnye ego ọzọ na nnukwu top-ups, otu dị ka na ngwa: 10%, 15% ma ọ bụ 20% ọzọ na standard top-ups site na 500, 1,000 ma ọ bụ 5,000 sats, na na Pro top-ups site na 5,000, 10,000 ma ọ bụ 50,000 sats.

nzọụkwụ

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

Topping Up N'elu Lightning

Na-eme ka a Lightning akaụntụ nke na-agbakwunye ego na nym nke isi bụ. Pay ya site na ọ bụla Lightning wallet, mgbe ahụ Tinye ya iji nweta credit.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning Ị chọrọ a API Key.

ỌnọdụụdịNlekọtaNkọwa
amountnọmbaEeỌnụ ọsọ, na currencyỌnụ ọnụ ọgụgụ niile maka sats.
currencyỌnwaỌ dịghịSATS (Ọ na-adịghị mma) USD ọ BTCDollars na-agbanwe na ugbu a Bitcoin price.
tierỌnwaỌ dịghịpro (ụzọ dịghị) ma ọ bụ standard: nke ego na-akwụ ụgwọ na-aga n'ihu.

A Standard Credit bụ 10 sats na a Pro Credit 100 sats, plus ihe ọ bụla bulk bonus; credits na-ekwu na ihe a na-agụnye.

nzọụkwụ

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
ọnọdụmgbe
400Otu n'ime ụzọ ọzọ (unsupported_method), a unknown ego (unsupported_currency) ma ọ bụ tier, a na-adịghị ọnụ ọgụgụ, ma ọ bụ ọnụ ọgụgụ n'okpuru ala (amount_too_small), ihe karịrị 1 000 000 tupu (amount_too_large) ma ọ bụ na-agba ọsọ site na Lightning wallet (amount_out_of_range).
429Ihe karịrị 60 akaụntụ maka a nym, ma ọ bụ 120 site na adreesị a, na awa (rate_limit_exceededN'ihi na Retry-After).
502Ọ dịghị akaụntụ nwere ike ime ugbu a (invoice_unavailableN'ihi na 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);

Ịchọpụta a top-up

Ọ na-akpọ ma ọ bụrụ na akaụntụ a na-akwụ ụgwọ na, mgbe ọ nwere, na-agụnye ego. Checking bụ ihe na-akwụ ụgwọ ya, ya mere mgbe ị na-akwụ ụgwọ, na-akwụ ụgwọ ruo status creditedChecking ọzọ mgbe ahụ bụ mma: na-akwụ ụgwọ otu oge, ma ọ bụrụ na ọtụtụ ugboro ị na-achọ.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - na-achọ a kpọmkwem si nym na-eme aka.

status Ọ bụ pending (N'ihi na ị na-adịghị ịkwụ ụgwọ), paid (Tinye, ma ọ bụghị na-akwụ ụgwọ; kpọtụrụ ugbu a), credited (na gị ego) ma ọ bụ expired (Ọ dịghị ịkwụ ụgwọ na oge). Ọdịdị ụlọ bụ maka nzọụkwụ na akaụntụ n'elu.

nzọụkwụ

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
ọnọdụmgbe
400The id bụghị 64-karịta id si create na-akpọ.
404Ọ dịghị akaụntụ site na id maka nym (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);

Ịhụnanya History

Otu akara per request: ihe ọ bụ, nke ụdị, ọtụtụ tokens na ihe ọ na-eri. Ọ dịghị nkwurịta okwu ma ọ bụ jụrụ, otú ọ dịghị na-atụ anya. A na-achịkwa akara maka 90 ụbọchị, ọhụrụ mbụ. A na-agba ọsọ ya nwere ike nweta akụkọ ihe mere eme ya.

GET https://nymbot.ai/api/v1/queries/history — mkpa a API key, nke na-ahụ ya onwe ya chọrọ, ma ọ bụ a Nkọwa ajụjụ site na nym gị, nke na-ahụ ihe niile nke key.

ỌnọdụụdịNlekọtaNkọwa
pageỌnụ ọgụgụ (query)Ọ dịghịDefault 1, na ihe karịrị 1,000; a elu page bụ 400 invalid_value.
page_countỌnụ ọgụgụ (query)Ọ dịghịRows per page. Default 20, na ihe karịrị 100.
start_date
end_date
ọkọlọtọ (Query)Ọ dịghịISO 8601 ụbọchị ma ọ bụ oge.
modelọkọlọtọ (Query)Ọ dịghịỌ bụ naanị ụdị a.
typeọkọlọtọ (Query)Ọ dịghịchat, responses, messages, image, video, speech, transcription ọ embedding.
all_keysỌnụ ọgụgụ (Query)Ọ dịghịNa a Key: true na-agụnye ihe niile nke otu nym. Default false.
key_idọkọlọtọ (Query)Ọ dịghịNa a na-akwụ ụgwọ, ma ọ bụ na all_keys=true: naanị nke a key.

nzọụkwụ

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

Nkọwa akaụntụ chọrọ

Ịmepụta, ịmepụta na ịmepụta keys, akaụntụ nchịkọta na akpaka top-ups na-adịghị na-enweta API key. Ha na-enweta akara site na nym gị, otú a na-enweta keys nwere ike na-eme ka ya cap ma ọ dịghị ike ime ka a ọzọ keys ma ọ bụ na-eme ka ya cap.

The ngwa na-eme nke a maka gị: ihe niile na ya ọkụ Sheet na-eji ndị a na-agba ọsọ. Ị na-adịghị mkpa na akụkụ a iji gbasara keys si njikọ gị.

The akara bụ ihe Nostr nke ụdị 27235 (NIP-98), na-esonụ base64 na-akpali akpali akpali akpali Authorization header na okwu Nostr na n'elu:

Ọnọdụ

{
  "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 bụ URL zuru ezu nke ajụjụ, ajụjụ string gụnyere, n'ụzọ zuru ezu.
  • method HTTP usoro.
  • payload bụ SHA-256 nke ihe na-atụ aro, na hex. Ọ dị mkpa na POST na PATCH, na body ị na-esonụ ga-abụ byte maka byte nke ị hashed.
  • created_at dị n'ime 60 sekọnd nke na-akwụ ụgwọ nke na-akwụ ụgwọ.
  • Ihe ọ bụla na-arụ ọrụ otu oge, a GET na-agụnye, otú a na-egbochi header nwere ike na-egbochi. Na-egbochi a ọhụrụ maka onye ọ bụla chọrọ. nonce tag na a random ọnụego ka abụọ chọrọ na-akpọ na otu sekọnd na-adịghị.
  • The body of a signed request nwere ike ịbụ n'elu 64 KB, na a body chọrọ Content-Type: application/json.

Ọ dịghị ihe omume na-aga 401 missing_nostr_auth; otu nke na-adịghị mma, na-adịghị mma, na-adịghị mma, ma ọ bụ maka a dị iche iche URL, usoro ma ọ bụ body na-atụ anya invalid_nostr_auth, na akụkọ ihe mere eme na ozi; a reused one returns nostr_auth_replayedThe akara na-echekwa tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ tọhapụ 429 na Retry-After.

Browsers nwere ike na-akpọ ndị endpoints a naanị site na saịtị Nymbot (https://nymbot.ai, https://nymchat.app na subdomains ha). A page na ihe ọ bụla ọzọ na saịtị na-enweta ọ dịghị CORS headers n'ihu, otú ọ nwere ike ịhụ ihe ha na-ere. Scripts na native apps, nke na-enweta ọ dịghị OriginỌ dịghị mmetụta.

Ọchịchị gị

Nkọwa mkpa gị nym's akara key (the nsec), nke na-akụziri ihe niile: nchịkọta gị, akụkọ ihe mere eme gị na ego gị. Na-eme ya n'ime akụkọ ihe mere eme na kọmputa ị na-akpali akpali, na-akpọ ya site na gburugburu ebe obibi karịa na-egosi ya n'ime faịlụ, na-akwado ngwa mgbe ị nwere ike.

Ndị ọrụ ndị a na-emepụta header. Ihe atụ ndị ọzọ na peeji nke a na-eji ha. Ha na-akpọ ihe siri ike na hex site na NOSTR_SECRET_HEX; The cURL a na-eji Ọchịchị ikpeazụ akara ngwá ọrụ, nke na-ewe nsec ma ọ bụ hex key, na sha256sum Na 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");
}

Akaụntụ Nyocha

Ihe API sheet nke ngwa na-egosi na n'elu: gị public key, ndị a na-ekwe omume, ọtụtụ keys na-arụ ọrụ (adịghị na-atụ anya ma ọ bụ na-atụ anya), na Automatic ịgbado ọkụ ọnọdụ, ma ọ bụ null Ọ bụrụ na ndị ọrụ na-adịghị na-enye ha.

GET https://nymbot.ai/api/v1/account Ị chọrọ a Nkọwa ajụjụ.

nzọụkwụ

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

Ngwaahịa Key

The endpoints n'okpuru list nke ngwa. All of them need a Nkọwa ajụjụOnye ọ bụla isi na-atụle na ụdị a, na oge na ISO 8601 na ego na sats:

Obere Object

{
  "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 Ọ dị nnọọ iji hụ a key ma ọ bụghị iji ya. The key itself is returned only once, when it is made.

Ngwaahịa Key

GET https://nymbot.ai/api/v1/keys Na-ekwu

ỌnọdụụdịNlekọtaNkọwa
include_revokedỌnụ ọgụgụ (Query)Ọ dịghịNa-agụnye kpọmkwem. Default false.

nzọụkwụ

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

Na-eme ka a Key

POST https://nymbot.ai/api/v1/keys N'ihi na ị na-ekwu, ị na-ekwu 201.

ỌnọdụụdịNlekọtaNkọwa
nameỌnwaEe1 ka 40 akara, dị iche iche na ndị ọzọ na-arụ ọrụ keys gị (n'agbanyeghị ihe).
limit_satsNtuziakaỌ dịghịThe ịkwụ ụgwọ cap na sats, ọ dịkarịa ala 1. Jiri ya n'ihi na ọ dịghị cap.
reset_periodỌnwaỌ dịghịdaily, weekly ọ monthlyỌnọdụ limit_sats.Tinye ya n'ihi na a cap na-adịghị reset.
expire_atstring ma ọ bụ integerỌ dịghịOzugbo a na-agba ọsọ: a ISO 8601 oge, ma ọ bụ milliseconds site na 1970.

Ịkwụ Ụgwọ (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"
  }
}
ọnọdụmgbe
400Ọ dịghị aha ma ọ bụ nnọọ ogologo aha; a na-eji aha (duplicate_name); a cap nke na-adịghị ọnụ ọgụgụ dịkarịa ala nke nta 1; a reset oge na-enweghị cap; a na-agba ọsọ n'oge gara aga; a na-adịghị mma ala (unknown_parameter); ma ọ bụ 25 na-arụ ọrụ keys ugbu a (too_many_keys).
429Ihe karịrị 60 keys mere site na a nym, ma ọ bụ 120 site na adreesị a, na otu awa (rate_limit_exceededN'ihi na 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);

Kpọtụrụ anyị

GET https://nymbot.ai/api/v1/keys/{id} Na-ekwu

ịkwụ ụgwọ {"data": {…}} na isi ihe, ma ọ bụ 404 key_not_found Ọ bụrụ na ị na-enweghị isi nke gị nwere 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);

Ịmepụta Key

PATCH https://nymbot.ai/api/v1/keys/{id} Na-ekwu

Kpọọ onye ọ bụla name, limit_sats, reset_period na expire_at, na ndị dị otú ahụ dị ka mgbe na-eme ka a key. null na-egbochi ebe: enweghị cap, enweghị reset, enweghị ikpeazụ. Ọ na-agbanwe oge reset na-agba ọsọ oge ọhụrụ na zero. A na-agba ọsọ na-agba ọsọ na-agba ọsọ (400 key_revoked(Nyocha {"data": {…}} na Key Object na-arụ ọrụ.

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

Tinye a Key

DELETE https://nymbot.ai/api/v1/keys/{id} Na-ekwu

Ọ na-agba ọsọ na-ekpo ọsọ, maka mma. Ọ na-agba ọsọ na revoked_at set, na nwere ike ịhụ na include_revoked=trueOzugbo a na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ.

nzọụkwụ

{ "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 ọkọlọtọ

Kpọtụrụ ụfụfụ Lightning na Nostr Wallet Connect na Nymbot na-ekpuchi ego onwe ya mgbe API na-agba ọsọ ọsọ ọsọ. The ngwa API sheet nwere ugbu a njikọ; ndị a bụ n'ebe ọsọ n'okpuru ya. Ha niile mkpa a Nkọwa ajụjụ.

Olee otú ọ na-arụ ọrụ: mgbe a API chọrọ na-akwụ ụgwọ na ego ị na-ahọrọ ịhụ, ma ọ bụrụ na ego a na-abịa n'okpuru ụkpụrụ gị, Nymbot na-eme ka akwụ ụgwọ maka ego gị, na-akwụ ụgwọ ya, na-agba ọsọ akwụ ụgwọ. Ọ na-akwụ ụgwọ n'elu ugboro n'ime 5 nkeji maka onye ọ bụla nym na ego, n'ihi na ihe ọ bụla na-agba ọsọ na-agba ọsọ na-agba ọsọ. Ọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọsọ. Ọ na-agba ọsọ na-agba ọsọ na-agba ọsọ na-agba ọs Top-up ọnọdụ credit ya.

Tụkwasịnụ Tụkwasịnụ

A njikọ string na-enye onye ọ bụla nwere ya na-achọ gị wallet ịkwụ ụgwọ. Nymbot na-egosi ya encrypted na ọ na-eji ya naanị ịkwụ ụgwọ ya onwe ya top-up akaụntụ, ma na-eme a njikọ naanị maka nke a, na a ịkwụ ụgwọ budget na gị wallet, otú ihe kasị ọ bụla nwere ike ịkwụ ụgwọ bụ a nọmba chere gị. The wallet nwere na-akwado pay_invoice.

Kpọtụrụ a wallet

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Na-ekwu

ỌnọdụụdịNlekọtaNkọwa
nwc_urlỌnwaEeThe njikọ string, na-amalite nostr+walletconnect://.Nymbot na-atụ aro na wallet maka get_info tọhapụ ya, na akwụsị ya encrypted.
threshold_satsNtuziakaEeTop up mgbe ego na-eri n'okpuru ndị a ọtụtụ sats. Ọnụ ọ bụla 1,000.
topup_satsNtuziakaEeỌ bụrụ na ị na-agba ọsọ. 1,000 ka 1,000,000 sats.
tierỌnwaỌ dịghịpro (ụzọ dịghị) ma ọ bụ standard: ego ịhụ na top up.

nzọụkwụ

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
ọnọdụmgbe
400Ọ dịghị njikọ string (invalid_nwc_url); ụfụfụ na-enweghị nsogbu n'ihi na ya relay (nwc_unreachable) ma ọ bụ na-ekwe omume (nwc_rejected); njikọ nwere ike ịkwụ ụgwọ akaụntụ (nwc_missing_permission); ma ọ bụ ọnụ ọgụgụ dị n'elu ụkpụrụ.
501Automatic top-ups na-adịghị na-akpali maka a server (nwc_unavailable). Nke a na-atụ anya na ndị ọzọ abụọ endpoints.

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

Ịgụ settings

GET https://nymbot.ai/api/v1/nwc-auto-topup Na-ekwu

Ọ na-ekwe nkwa otu ihe dị ka njikọ, na connected: false na ndị ọzọ ụlọ null mgbe ọ dịghị ụfụfụ na-enweghị njikọ. The njikọ akara na-enweghị ikpeazụ.

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

Ịgbado ọkụ

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Na-ekwu

Na-egosi njikọ nchekwa string. Ọ dịghị ihe ndị ọzọ na-emepụta. Iji jide n'aka, ị nwere ike na-agba ọsọ njikọ na wallet gị.

nzọụkwụ

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

Ịkwụ ụgwọ on request na-enweghị isi

The fixed-price endpoints nwere ike ịkwụ ụgwọ maka otu nchịkọta oge n'oge Lightning, na-enweghị isi, enweghị akaụntụ na enweghị ego: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations na POST /embeddings. Chat, Responses na Messages na-achọ a isi. A chọrọ na-enweta a isi na-akwụ ụgwọ na ego dị ka ọ dị n'ezie; akwụ ụgwọ na-amalite naanị mgbe ọ dịghị isi na-enweta.

Nymbot na-ekwu abụọ version nke otu nsogbu, si otu backend: Lightning Labs ' Ọnụ 402 (Ọ na-enweta n'okpuru aha ya gara aga, LSAT) na IETF ntọala Ịkwụ Ụgwọ HTTP authentication usoro na lightning Method na charge Ọ bụrụ na ị na-eme ka ị na-eme ka ị na-eme ka ị na-eme ka ị na-eme.

Na-agba ọsọ gị Server

Ịkwụ ụgwọ na-enweghị isi bụ na naanị mgbe API_L402_SECRET nwere ihe dịkarịa ala 32 bytes, dị ka hex (64 akara) ma ọ bụ base64 (44). openssl rand -hex 32A na-agba ọsọ ma ọ bụ na-agba ọsọ ọnụ ọgụgụ na-egbochi ọrụ na-egbochi ihe mere. Iji na-agba ọsọ ya, API_L402_SECRET_PREVIOUS maka a ụbọchị: akara, ọnọdụ URLs na nsogbu mere n'okpuru ya na-arụ ọrụ ruo mgbe ha na-agba ọsọ.

Nkọwa

Kpọtụrụ anyị na No Authorization header. Ọ bụrụ na ọ dị ikike, ọ dịghị ihe ọ bụla na-agba ọsọ 402 Payment Required na akaụntụ maka ihe n'ụzọ zuru ezu nke ajụjụ na-akwụ ụgwọ: ugbu a price a key ga-akwụ ụgwọ, na-agbanwe na 10 sats a standard credit ma ọ bụ 100 sats a Pro credit na na-agba ọsọ ka a zuru okè sat (atụle na 1 sat, na ọ dịkarịa na 0.05 credit minimum). WWW-Authenticate nzọụkwụ maka otu akaụntụ:

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

Ịkwụ Ụgwọ request Parameter bụ base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Ọrịa a na-akpali akpali akpali akpali, na Content-Type (nke media ụdị na, maka multipart, ya n'akụkụ) na na SHA-256 nke n'ụzọ zuru ezu body bytes ị na-esonụ, na-agba ọsọ 15 nkeji. Mgbe ịkwụ ụgwọ, Ọdịdị ajụjụ ọzọ: The same Content-Type na otu JSON bytes, ma ọ bụ maka multipart endpoints (/images/edits, /audio/transcriptions, /audio/translations) otu multipart body na otu n'akụkụ. Ọtụtụ HTTP libraries na-ekpuchi a ọhụrụ n'akụkụ mgbe ọ bụla ha encode a form, otú encode ya otu ugboro na-enye ndị a bytes abụọ.

Onye ọ bụla adreesị nwere ike ịchọrọ maka 30 nsogbu kwa nkeji (a IPv6 adreesị na-egosi dị ka ọ bụla /64). Ngwongwo nke adreesị na-adịghị a maara na-egosi a kpọmkwem 10 kwa nkeji, na e nwere a zuru okè na nsogbu Nymbot nsogbu n'etiti ndị niile adreesị; a nsogbu na-agba ọsọ tupu a nsogbu na-eme (dịka na a na-adịghị mma JSON) na-agba ọsọ n'ihi ya. 429 na Retry-AfterỊkwụ ụgwọ endpoints na-akpọ na-enweghị isi ma ọ bụ ahaziri na-agụnye ka n'ikpeazụ nso nke 120 na-enweghị ahaziri chọrọ kwa nkeji kwa adreesị. A ahaziri na-akpọ na-akpọ na-enweghị isi ma ọ bụ ahaziri, na a chọrọ nke Content-Type Ọ bụghị application/json (Ọ bụ multipart/form-data n'ihi na uploads) na-adịghị 415 Ọ bụghị mgbe ọ bụla akaụntụ.

Embeddings na-akwụ ụgwọ site na a na-akwụ ụgwọ nke tokens na input, na a 1.5 & times; margins, n'ihi na ihe n'ezie na-ekwu mgbe ahụ. Ị na-akwụ ụgwọ maka tokens na-eji, na na-adịghị eji akụkụ nke ịkwụ ụgwọ na-aga dị ka a Ịkwụ ụgwọ token.

Ịkwụ Ụgwọ

Ịkwụ ụgwọ akaụntụ na ọ bụla Lightning wallet. The wallet na-enye gị preimage, 64 hex characters. Mgbe ahụ na-enye otu chọrọ na otu n'ime ndị a:

NgwaahịaỌchịchị
Ọnụ 402Authorization: L402 <macaroon>:<preimage> (LSAT Ọ na-arụ ọrụ)
Ịkwụ ỤgwọAuthorization: Payment <base64url JSON>, ebe JSON bụ {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

A na-akwụ ụgwọ ajụjụ na-atụle dị ka otu na-eme na a key, n'agbanyeghị na nymbot Object na-enweghị akụkụ: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}Na ọ dịghị X-Nymbot-Balance-Sats header. A na-akwụ ụgwọ na usoro ịkwụ ụgwọ ga-enweta a Payment-Receipt header (base64url JSON na nsogbu id, ego hash dị ka reference, status na timestamp). Ịkwụ ụgwọ ajụjụ na-enweghị ihe ọ bụla nym, otú ha adịghị na-egosi na ajụjụ akụkọ ihe mere eme.

ọnọdụmgbe
402 payment_already_usedOnye ọ bụla ịkwụ ụgwọ na-akwụ ụgwọ maka otu nchịkọta. Ngwọta bụ a ọhụrụ nsogbu maka nchịkọta a, n'ihi ya, a ahịa na-ekpuchi ya ikpeazụ credential (dị ka lnget na) dị nnọọ na-atụ anya.
402 payment_mismatchThe credential e guzobere maka ọzọ endpoint, Content-Type or body, or pays less than this request now costs. A ọhụrụ challenge for this request comes with it; ọ bụrụ na ịkwụ ụgwọ bụ obere, ihe ịkwụ ụgwọ na-eri dị ka a Ịkwụ ụgwọ token (refund_token na refund_sats na nke ahụ).
402 payment_expiredỌ bụ ihe karịrị 15 nkeji site na nsogbu. A ọhụrụ nsogbu na-agba ọsọ ya. Ọ bụrụ na preimage na-egosi na ị na-agba ọsọ, ihe ị na-agba ọsọ na-agba ọsọ Ịkwụ ụgwọ token (refund_token na refund_sats n'ime ahụ), mgbe ahụ; a credential na-eji.
401 invalid_preimageThe preimage na-enweghị hash na akaụntụ ego hash. The ịkwụ ụgwọ na-adịghị na-eji.
401 invalid_payment_credentialThe credential bụ malformed, na-agbanwe mgbe Nymbot na-emepụta ya, ma ọ bụ na-akpọ a nkwụnye hash Nymbot na-adịghị na-emepụta akaụntụ maka. A macaroon na a nkwado Nymbot adịghị ma ọ bụ na ndị na-agba ọsọ nkwado, na-adịghị.
429 rate_limit_exceededIhe karịrị 30 nchịkọta ma ọ bụ keys na-adịghị ike ịkpọ ụgwọ na-abịa site na adreesị a n'ime a nkeji, ma ọ bụ a nkwụnye ego token e jiri ihe karịrị 60 ugboro n'ime a nkeji. 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"));

ahịa na-ewu ewu mppx na Lightning usoro na-arụ ọrụ na Payment challenge ha; na-egosi ha na n'ikpeazụ na-akwụ ụgwọ ha.

Ngwaahịa

Ịkwụ ụgwọ POST /videos nzọụkwụ 202 dị ka a keyed otu, plus a status_url: GET Ọ na-akpọ na-arụ ọrụ na-arụ ọrụ maka 24 awa, n'ihi na ọrụ a na-achịkwa.

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

Kpọtụrụ anyị refund_token site na mkpanaka a: ọ na-egosi na a naanị ebe a. Ọ bụ n'èzí mgbe video na-egosi (GET /api/v1/l402/refunds nzọụkwụ "status": "pending"); ma ọ bụrụ na rendering na-adịghị ekwesị, ịkwụ ụgwọ na-eme ya. The status URL na-egosi refund_sats maka ọrụ na-akwụ ụgwọ ma ọ bụghị token, n'ihi ya, na-agụnye ọnọdụ URL adịghị na-akwụ ụgwọ. Ịchọpụta token na-akwụ ụgwọ ọrụ na-enweghị onye ọ bụla na-akwụ ụgwọ.

Ịkwụ ụgwọ

Ọ bụrụ na a na-akwụ ụgwọ chọrọ na ndị ọrụ na-akwụ ụgwọ Nymbot maka nzọụkwụ, ịkwụ ụgwọ na error na-ekwu, na charged_satsỌ bụrụ na ọ na-adịghị mma na-adịghị mma na-adịghị mma, na-adịghị mma na-adịghị mma Ịkwụ ụgwọ token Ọ bụ ihe ị na-eji:

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

Ọ dịghị eji akụkụ na-atụle na otu ụzọ: ma ọ bụrụ na ị na-atụle abụọ foto na otu na-adịghị na-akwụ ụgwọ, na-atụle nke ọma nymbot Object nwere a refund token maka ndị na-adịghị; a transcription nke ogologo nke enweghị ike ịhụ n'ihu na-akwụ ụgwọ maka oge kachasị ogologo faịlụ nwere ike ịbụ (agba ọsọ 30 nkeji), na ihe dị iche na ogologo ahụ na-abịa dị ka a refund token; ma ọ bụrụ na ọ na-agba ọsọ 30 nkeji, ọ na-agba ọsọ 413 na ịkwụ ụgwọ zuru ezu na-atụle. Embeddings na-atụle ihe ndị na-atụle na-atụle. A na-atụle video na-atụle na token ya nkwado.

A nkwụnye ego token bụ a random 256-bit koodu. Nymbot na-egosi naanị ya hash, na ọ na-agba ọsọ mgbe 30 ụbọchị. Ọ nwere a sat ego, na ị nwere ike:

  • Ịkwụ ụgwọ ya. Tinye Authorization: Bearer REFUND-… na ọ bụla n'okpuru n'ikpeazụ endpoints (a OpenAI SDK na-eji ya dị ka API key). The price na-abịa na token na ihe na-abịa na ya (refund_token_sats Na The nymbot Object). A token dịkarịa ala karịa ndị na-esonụ 402 refund_insufficient; a na-abụghị na-akwụ ụgwọ na-etinye sats n'elu otu token.
  • Tinye ya. GET /api/v1/l402/refunds na otu header na-aga {"sats": 237, "status": "open", "expires_at": "..."}.
  • Otu token nwere ike iji ihe karịrị 60 ugboro kwa nkeji.
  • Mepụta ya na a nym. Pịa ya n'ime Tinye ajụjụ na Nymbot ngwa, ma ọ bụ na-akpọ POST /api/v1/l402/refunds/redeem na a Nkọwa ajụjụ na {"refund_token": "REFUND-...", "balance": "standard"} (Ọ bụ "pro"N'ụzọ zuru ụgwọ na-aga n'ụzọ zuru ụgwọ (10 sats onye ọ bụla on Standard, 100 on Pro); sats na-adịghị na-eme ka a zuru ụgwọ na token maka API chọrọ.

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"

nzọụkwụ

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