Mandehana any amin'ny votoaty
Miverena any amin'ny Nymbot

Ny fototry ny fahalalana Ny mpandrindra

Balance, Top-ups sy ny fanalahidy

Jereo izay anananao, mihazakazaka amin'ny Lightning, mihazakazaka avy amin'ny volanao manokana, jereo ny vidin'ny fangatahana tsirairay, ary mitantana ny fanalahidy avy amin'ny code.

Tsidiho ny fitoviana

Ireo roa ireo dia ny tahirin-kevitrao, ary ny habetsahan'ny kapila amin'ity fanalahidy ity dia ampiasaina.

GET https://nymbot.ai/api/v1/credits/balance Mila ny fanalahidy API ianao. POST Miasa ihany koa, ho an'ny mpanjifa izay manantena izany.

balance Ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidiny (null Raha tsy afaka mamaky ny vidiny). Ny sisa dia ao amin'ny credits sy sats, izay no fomba fitehirizana ny salan'ny tena. key Manoratra ny fanalahidy izay nangataka. Ny fanalahidy izay efa nahatratra ny kapila dia mbola afaka manamarina ny salan-tsakafo.

Ny valiny

{
  "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"
  }
}
Ny toeranyRehefa
401Ny fanalahidy dia tsy hita, tsy fantatra, voamarina na tapitra.

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

Ny fomba fandoavam-bola

Ahoana no ahafahanao miakatra, ary ny fetra. Lightning no fomba tokana.

GET https://nymbot.ai/api/v1/topup/payment-methods Tsy ilaina ny fanalahidy.

Ny top-up dia 10 ka hatramin'ny 1.000.000 sats; ny Pro-top-up dia tsy maintsy mividy kely indrindra ny iray Pro credit, noho izany dia manomboka amin'ny 100 sats. bulk_bonus Ity lisitra ity dia mamaritra ny karama fanampiny amin'ny top-ups lehibe kokoa, mitovy amin'ny ao amin'ny fampiharana: 10%, 15% na 20% mihoatra amin'ny standard top-ups avy amin'ny 500, 1,000 na 5,000 sats, ary amin'ny Pro top-ups avy amin'ny 5,000, 10,000 na 50,000 sats.

Ny valiny

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

Miakatra eo ambonin'ny Lightning

Manangana karatra Lightning izay manampy ny karatra amin'ny nym izay ananan'ny fanalahidy. Mandoa izany avy amin'ny karatra Lightning, dia Jereo izany Mba hahazoana ny trosa fanampiny.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning Mila ny fanalahidy API ianao.

Ny sehatraNy karazanaTsy maintsyNy famaritana
amountNy isaENYAry ny habetsaky ny, ao currencyNy isa iray manontolo ho an'ny vidiny.
currencyNy StringTsySATS Ny tsy fahampian'ny USD Ary BTCNy dolara dia miova amin'ny vidin'ny Bitcoin ankehitriny.
tierNy StringTsypro (Ny tsy fahampian-tsakafo) na standard: amin'ny taham-pahamehana ny fampindramam-bola.

Ny fampindramam-bola ankapobeny dia 10 sats sy ny Pro fampindramam-bola 100 sats, plus na inona na inona tombony; credits Manambara ny zavatra hanampy amin'ity kaonty ity.

Ny valiny

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
Ny toeranyRehefa
400Ny fomba hafa amin'ny lalana (unsupported_method, ny vola tsy fantatra (unsupported_currency(Na dia tsy ampy aza ny fandoavam-bola, na tsy ampy aza ny fandoavam-bola)amount_too_smallAmin'ny ankapobeny, mihoatra ny 1 tapitrisa (amount_too_large) na tsy nahazo alalana avy amin'ny Lightning Wallet (amount_out_of_range).
429Mihoatra ny 60 faktiora ho an'ity nym ity, na 120 avy amin'ity adiresy ity, ao anatin'ny ora iray (rate_limit_exceededAo amin'ny Retry-After).
502Tsy azo atao amin'izao fotoana izao ny fanamarinana (invoice_unavailableAo amin'ny 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);

Tsidiho ny top-up

Manontany raha efa nandoa ny faktiora ary, rehefa manana, dia manampy ny karama. Ny fanamarinana dia ny karama, ka aorian'ny fandoavam-bola, jereo mandra-pahatongan'ny toe-javatra creditedNy fanaraha-maso indray dia azo antoka: ny trosa dia tonga indray mandeha, na inona na inona indray mandeha ianao.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - mila fanalahidy avy amin'ny nym izay nanao ny faktiora.

status Ny pending (Ary mbola tsy voavonjy ny vola) paid (mandoa vola, fa mbola tsy voavidy; jereo indray), credited (na amin'ny tahirin-kevitrao) na expired [Na: Fa inona no fanantenan'ny mpihatsaravelatsihy, na dia mahazo harena aza.

Ny valiny

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
Ny toeranyRehefa
400Ny ID dia tsy ny 64-marika ID avy amin'ny famoronana antso.
404Tsy misy fangatahana avy amin'io ID io ho an'ny 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);

Tian'ny tantara

Ny andininy iray isaky ny fangatahana: inona no izy, inona ny modely, firy token, ary inona ny vidiny. Tsy misy fangatahana na valiny voatahiry, ka tsy misy miverina. Ny andininy dia voatahiry mandritra ny 90 andro, vaovao indrindra voalohany. Ny fanalahidy izay efa nahatratra ny kapila dia mbola afaka mamaky ny tantara.

GET https://nymbot.ai/api/v1/queries/history - mila API fanalahidy, izay mahita ny fangatahany manokana, na Nanoratra ny fangatahana avy amin'ny nym, izay mahita ny fanalahidin'ny tsirairay.

Ny sehatraNy karazanaTsy maintsyNy famaritana
pageNy fanontaniana diaTsyDefault 1, amin'ny ankamaroan'ny 1000; ny pejy ambony dia 400 invalid_value.
page_countNy fanontaniana diaTsyRays per page. Default 20, amin'ny ankamaroan'ny 100.
start_date
end_date
Ny fanontaniana diaTsyISO 8601 daty na fotoana.
modelNy fanontaniana diaTsyNy modely ihany.
typeNy fanontaniana diaTsychat, responses, messages, image, video, speech, transcription Ary embedding.
all_keysNy fomba fanao (query)TsyNy fanalahidy iray: true ahitana ny tsirairay amin'ny nym. Default false.
key_idNy fanontaniana diaTsyAmin'ny fangatahana voasoratra anarana, na amin'ny all_keys=trueTsy misy afa-tsy ity fanalahidy ity.

Ny valiny

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

Manaiky ny fangatahan'ny kaonty

Ny famoronana, ny fanovana sy ny fanafoanana ny fanalahidy, ny famaranana ny kaonty sy ny fanapahan-kevitra automatique dia tsy mandray ny fanalahidin'ny API. Izy ireo dia mandray ny fanamarihana avy amin'ny nym, ka ny fanalahidin'ny fanalahidin'ny kaonty dia afaka mandany hatramin'ny fahafahany, fa tsy afaka manao fanalahidin'ny fanalahidin'ny kaonty hafa na hampitombo ny fahafahany.

Ny fampiharana dia manao izany ho anao: ny zava-drehetra ao amin'ny Ny afo Ny pejy dia mampiasa ireo endpoints. Tsy ilainao afa-tsy ity fizarana ity mba hanara-maso ny fanalahidy avy amin'ny code anao manokana.

Ny fanamarihana dia zava-nitranga Nostr amin'ny karazana 27235 (NIP-98), nalefa amin'ny base64 Authorization Header miaraka amin'ny teny Nostr Ary eo anoloan'ny

Ny zava-nitranga

{
  "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 dia ny URL feno amin'ny fangatahana, anisan'izany ny fanontaniana, toy ny nalefa.
  • method Ny fomba HTTP.
  • payload dia ny SHA-256 amin'ny vatana fangatahana voajanahary, amin'ny hex. POST SY PATCHary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota ; ary Obeda an'i Jese ;
  • created_at Tokony ho ao anatin'ny 60 segondra avy amin'ny mpizara ny fotoana.
  • Ny zava-drehetra dia miasa indray mandeha, a GET voasoratra ao amin'ny fangatahana, ka tsy afaka mamerina indray ny lohateny voasoratra. Manoratra iray vaovao ho an'ny fangatahana tsirairay. nonce ny marika miaraka amin'ny isa tsy ara-drariny mba hisorohana fangatahana roa voasoratra ao anatin'ny segondra iray ihany mbola tsy mitovy.
  • Ny vatana voasoratra ao amin'ny fangatahana dia mety ho 64 KB, ary ny vatana dia mila Content-Type: application/json.

Miverena ny zava-nitranga tsy hita 401 missing_nostr_authiray izay tsy tsara noforonina, ratsy voasoratra, tranainy loatra, na ho an'ny URL hafa, fomba na vatana dia miverina invalid_nostr_authary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota . nostr_auth_replayedNy fanamarihana dia voamarina alohan'ny hamaky ny vatana, ary ny adiresy tsirairay dia mety tsy mahavita azy 30 fotoana isaky ny minitra (ny adiresy IPv6 dia mifanaraka amin'ny /64); Aorian'izany dia mahazo 429 Ny Retry-After.

Ny navigateur dia afaka miantso ireo endpoints avy amin'ny tranokalan'i Nymbot fotsiny (https://nymbot.ai, https://nymchat.app ary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota ; ary Obeda niteraka an'i Jese ; OriginTsy misy fiantraikany.

Ny fanalahidy miafina

Ny fanamarihana dia mila ny fanalahidin'ny nym anao (ny nsec), izay manara-maso ny zava-drehetra: ny mombamomba anao, ny tantara sy ny tahirin-kevitrao. Aoka ho voasoratra ao amin'ny script ao amin'ny milina izay matoky anao, mamaky azy avy amin'ny tontolo iainana fa tsy manoratra azy ao amin'ny rakitra, ary misafidy ny fampiharana rehefa afaka.

Ireo mpanampy ireo dia mamorona ny lohateny. Ny ohatra farany eto amin'ity pejy ity dia mampiasa azy ireo. Manoratra ny fanalahidy malalaka amin'ny hex avy amin'ny NOSTR_SECRET_HEXNy CURL iray dia mampiasa ny Ny fitaovana, izay mandray ny nsec na hex key, ary sha256sum Ao amin'ny 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");
}

Ny famaritana ny kaonty

Inona no hita ao amin'ny lisitry ny API ao amin'ny fampiharana: ny fanalahidy an-tserasera, ny fahasamihafana, ny isan'ny fanalahidy mavitrika (tsy voamarina na tsy tapitra), ary ny Automatika ny top-up Ny fametrahana, na null raha tsy manolotra azy ireo ny mpizara.

GET https://nymbot.ai/api/v1/account Mila ny Nanoratra ny fangatahana.

Ny valiny

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

Ny fitantanana ny fanalahidy

Ny endpoints ao ambadiky ny lisitry ny fanalahidin'ny fampiharana. Ny rehetra dia mila Nanoratra ny fangatahanaNy tsirairay dia miverina amin'ity endrika ity, miaraka amin'ny fotoana ao amin'ny ISO 8601 sy ny habetsaky ny sats:

Ny lohahevitra

{
  "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 Izany dia ampy mba hahafantarana ny fanalahidy fa tsy hampiasa azy. Ny fanalahidy ihany no miverina indray mandeha, rehefa natao.

Ny fanalahidy

GET https://nymbot.ai/api/v1/keys Nandray ny fanambarana.

Ny sehatraNy karazanaTsy maintsyNy famaritana
include_revokedNy fomba fanao (query)TsyAmpifanaraka amin'ny fanamafisana ny fanamafisana. Default false.

Ny valiny

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

Ny fananganana ny fanalahidy

POST https://nymbot.ai/api/v1/keys Miverena amin'ny 201.

Ny sehatraNy karazanaTsy maintsyNy famaritana
nameNy StringENY1 ka hatramin'ny 40 marika, tsy mitovy amin'ny fanalahidy hafa mavitrika (tsy manadino ny tranga).
limit_satsTsy miankinaTsyNy fandoavam-bola cap amin'ny sats, fara fahakeliny 1.
reset_periodNy StringTsydaily, weekly Ary monthlyMila ny limit_satsAvelao izany ho an'ny kapoaka izay tsy miverina intsony.
expire_atString na ny integer.TsyRehefa tsy miasa ny fanalahidy: ISO 8601 fotoana, na milliseconds hatramin'ny 1970.

Ny valiny (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"
  }
}
Ny toeranyRehefa
400Ny anarana tsy misy na lava loatra; anarana efa ampiasaina (duplicate_name); cap izay tsy isan'andro farafaharatsiny 1; fe-potoana famerenana tsy misy cap; vanim-potoana tapakila amin'ny lasa; sehatra tsy fantatra (unknown_parameter); na 25 ny fanalahidy miasa efa (too_many_keys).
429Mihoatra ny 60 fanalahidy vita amin'ity nym ity, na 120 avy amin'ity adiresy ity, ao anatin'ny ora iray (rate_limit_exceededAo amin'ny 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);

Vakio ny fanalahidy iray

GET https://nymbot.ai/api/v1/keys/{id} Nandray ny fanambarana.

Miverena {"data": {…}} miaraka amin'ny lohahevitra fototra, na 404 key_not_found Raha tsy misy ny anaran'ny anao dia manana izany 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);

Miova ny fanalahidy

PATCH https://nymbot.ai/api/v1/keys/{id} Nandray ny fanambarana.

Handefa ny iray amin'ireo name, limit_sats, reset_period SY expire_at, amin'ny fitsipika mitovy amin'ny amin'ny fametrahana fanalahidy. null Tsy misy fanitsiana, tsy misy famerenana, tsy misy famaranana. Ny fanitsiana ny vanim-potoana dia manomboka ny vanim-potoana vaovao amin'ny zero. Ny fanitsiana dia tsy azo ampiharina (400 key_revokedMiverena ny {"data": {…}} miaraka amin'ny fitaovana manan-danja vaovao.

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

Ny fanesorana ny fanalahidy

DELETE https://nymbot.ai/api/v1/keys/{id} Nandray ny fanambarana.

Manakana ny fanalahidy avy hatrany, ho an'ny tsara. Mijanona ao amin'ny lisitry ny revoked_at voasoratra, ary azo jerena amin'ny include_revoked=trueNy famerenana ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin'ny fanalahidin

Ny valiny

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

Ao amin'ny NWC Auto-top-up

Mifandray amin'ny Lightning Wallet miaraka amin'ny Nostr Wallet Connect ary ny Nymbot dia manatsara ny salan-tsakafo amin'ny tenany rehefa mampiasa ny API dia mihazakazaka. Ny rakitra API amin'ny fampiharana dia manana fepetra mitovy; ireo dia ny endpoints manaraka azy. Nanoratra ny fangatahana.

Ahoana no miasa: Aorian'ny fangatahana API dia voavidy ho amin'ny salan-tsakafo izay nifidy mba hijery, raha ny salan-tsakafo dia nidina ambany ny fe-potoan'ny, ny Nymbot dia mametraka faktiora ho an'ny habetsaky ny vola, mangataka ny volan-dalamby mba handoa azy, ary manampy ny fampindramam-bola. Izany dia miakatra hatramin'ny indray mandeha isaky ny 5 minitra ho an'ny nym sy ny salan-dalamby, noho izany dia tsy afaka mamono ny volan-dalamby ny fangatahana. Ny fandaniana ao amin'ny fampiharana dia tsy miteraka izany. Ny fotoana sy ny habetsaky ny farany, ary ny fahadisoana farany, dia ao amin'ny safidy; Ny top-up dia Mino izany ny

Alohan'ny mifandray amin'ny Wallet

Ny Nymbot dia mitahiry izany amin'ny alàlan'ny fandoavam-bola ary mampiasa azy fotsiny amin'ny fandoavam-bola ho an'ny faktiorony manokana, fa manao fifandraisana fotsiny ho an'izany, miaraka amin'ny fandoavam-bola ao amin'ny fonosanao, ka ny ankamaroan'ny afaka mandoa dia ny isan'ny nifidy anao. pay_invoice.

Mifandray amin'ny Wallet

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Nandray ny fanambarana.

Ny sehatraNy karazanaTsy maintsyNy famaritana
nwc_urlNy StringENYNy fifandraisana, manomboka amin'ny nostr+walletconnect://Ny Nymbot dia mitaky ny Wallet ho an'ny get_info alohan'ny hamonjena azy, ary mitahiry izany voasoratra anarana.
threshold_satsTsy miankinaENYMiakatra eo amin'ny ambaratonga ambony rehefa mihena ambany amin'io vidin-javatra maro io. farafaharatsiny 1000.
topup_satsTsy miankinaENYOhatrinona no hanampy isaky ny fotoana. 1000 ka hatramin'ny 1.000.000 sats.
tierNy StringTsypro (Ny tsy fahampian-tsakafo) na standard: ny fitoviana mba hijery sy ny ambony.

Ny valiny

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
Ny toeranyRehefa
400Tsy misy fifandraisana (invalid_nwc_url[Na: Fa inona no fanantenan'ny mpihatsaravelatsihy, na dia mahazo harena be aza.nwc_unreachable) na tsy nanaiky ny fanaraha-maso (nwc_rejected); ny fifandraisana dia tsy afaka mandoa faktiora (nwc_missing_permission); na vola ivelan'ny fetra.
501Tsy voaaro ho an'ity serivisy ity ny fametrahana automatic top-ups (nwc_unavailableToy izany ihany koa amin'ny farany roa hafa.

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

Vakio ny safidy

GET https://nymbot.ai/api/v1/nwc-auto-topup Nandray ny fanambarana.

Miverena ny zavatra mitovy amin'ny mifandray, amin'ny connected: false Ary ny sehatra hafa null Rehefa tsy misy saram-pifandraisana mifandray, dia tsy hiverina mihitsy ny famantarana ny fifandraisana.

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

Ny fifandraisana

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Nandray ny fanambarana.

Hamafa ny fifandraisana voatahiry. Tsy misy fanapahan-kevitra intsony. Mba ho azo antoka, azonao atao ihany koa ny manafoana ny fifandraisana ao amin'ny wallet.

Ny valiny

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

Mandoa vola amin'ny fangatahana tsy misy fanalahidy

Ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin'ny vidin-javatra: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations SY POST /embeddingsNy fangatahana izay mitondra ny fanalahidy dia ampidirina amin'ny tahiry toy ny mahazatra; ny fandefasana fandoavam-bola dia manomboka raha tsy misy fanalahidy alefa.

Ny Nymbot dia miteny dikan-teny roa amin'ny hevitra mitovy, avy amin'ny backend iray: Lightning Labs' Ny 402 (Misy ihany koa ny anaran'ny reniny taloha, LSAT) ary ny tetikasa IETF Ny karama Ny rafitra fanamarinana HTTP miaraka amin'ny lightning Ny fomba sy charge Mampiasa izay mahatakatra ny mpanjifanao.

Mandeha amin'ny mpizara anao manokana

Ny fandoavam-bola tsy misy fanalahidy dia amin'ny fotoana API_L402_SECRET mitana farafaharatsiny 32 bytes, toy ny hex (64 marika) na base64 (44). openssl rand -hex 32Ny isa fohy kokoa na azo antoka dia manakana ny endri-javatra ary manoratra ny antony. API_L402_SECRET_PREVIOUS ho an'ny andro iray: ny fahazoan-dalana, ny tranonkala URL sy ny fanamby nataony eo ambany dia mbola miasa mandra-pahatongan'izy ireo.

Ny fanamby

Mandefa ny fangatahana miaraka amin'ny tsy Authorization Header. Raha manan-kery izany, tsy misy zavatra mihazakazaka, ary mahazo 402 Payment Required miaraka amin'ny faktiora ho an'ny marina izay fangatahana vidiny: ny vidiny mitovy amin'ny fanalahidy dia handoa, niova amin'ny 10 Sats ny fitokisana ara-dalàna na 100 Sats ny Pro fitokisana ary manodidina hatramin'ny iray manontolo Sats (amin'ny farafaharatsiny 1 Sats, ary farafaharatsiny ny 0.05 credit minimum). WWW-Authenticate Fanamby ho an'ny kaonty mitovy:

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

Ny fandoavam-bola request Ny endrika dia base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Ny fanamby dia mifandray amin'ny farany, amin'ny Content-Type (ny karazana haino aman-jery sy, ho an'ny ampahany maro, ny sisiny) ary ny SHA-256 ny vatana marina bytes ianao naniraka, ary maharitra 15 minitra. Ny mitovy Ny fangatahana indray: mitovy Content-Type ary ny JSON bytes mitovy, na ho an'ny endpoints maro (/images/edits, /audio/transcriptions, /audio/translationsNy ankamaroan'ny tranonkala HTTP dia misafidy fetra vaovao isaky ny mandrakotra endrika, noho izany dia mandrakotra azy indray mandeha ary mandefa ireo bytes roa.

Ny adiresy tsirairay dia afaka mangataka fanamby 30 isaky ny minitra (ny adiresy IPv6 dia mifanaraka amin'ny /64). Ny fangatahana izay adiresy tsy fantatra dia mizara 10 isaky ny minitra, ary misy fetra manontolo amin'ny fanamby ny olana Nymbot amin'ny adiresy rehetra; ny fangatahana voadika alohan'ny fanamby (ohatra amin'ny vatana izay tsy manan-kery JSON) dia tsy mifanaraka amin'izany. 429 Ny Retry-After, nalefa alohan'ny famakiana ny vatana. Ny endpoints voavonjy antsoina tsy misy fototra na fahazoan-dalana koa dia mifantoka amin'ny fetran'ny ankapobeny 120 fangatahana tsy voamarina isaky ny minitra. Ny fahazoan-dalana dia voamarina alohan'ny famakiana ny vatana, ary ny fangatahana izay Content-Type Tsy application/json Na ny multipart/form-data Na izany aza, ny fanesorana dia tsy voatery 415 Tsy mahazo faktiora mihitsy aho.

Ny fidirana dia mifototra amin'ny vidin'ny token ao amin'ny fidirana, miaraka amin'ny marika 1.5; fotoana, satria ny isan'ny tena dia fantatra fotsiny aorian'izay. Miverina amin'ny token.

Handefa ny fandoavam-bola

Mandoa ny faktiora amin'ny Wallet Lightning. Ny Wallet dia manome anao ny preimage, 64 hex characters. Avy eo mandefa ny fangatahana mitovy amin'ny iray amin'ireto:

Ny rafitraNy header
Ny 402Authorization: L402 <macaroon>:<preimage> (LSAT Izy koa dia miasa)
Ny karamaAuthorization: Payment <base64url JSON>Raha misy ny JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Ny fangatahana voavaly dia mifanaraka amin'ny fangatahana atao amin'ny fanalahidy, afa-tsy ny nymbot Ny fitaovana dia tsy manana sehatra fitoviana: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}Ary tsy misy ny X-Nymbot-Balance-Sats header. Ny fangatahana nomena amin'ny rafitra fandoavam-bola koa dia mahazo Payment-Receipt header (base64url JSON miaraka amin'ny fanamby id, ny fandoavam-bola hash toy reference, status SY timestampNy fangatahana nomena dia tsy mifandray amin'ny nym, noho izany dia tsy hita ao amin'ny tantara fanontaniana.

Ny toeranyRehefa
402 payment_already_usedNy valiny dia fanamby vaovao ho an'ity fangatahana ity, noho izany, ny mpanjifa izay mihazakazaka ny fampahafantarana farany (toy ny lnget Ary indray ny tany ihany no miverina.
402 payment_mismatchNy fampahafantarana dia navoaka ho an'ny toerana iray hafa, Content-Type na vatana, na mandoa latsaky ny vidin'io fangatahana io ankehitriny. Ny fanamby vaovao ho an'ity fangatahana ity dia tonga miaraka aminy; raha kely loatra ny fandoavam-bola, dia miverina ho toy ny Miverina amin'ny token (refund_token SY refund_sats Ao amin'ny vatana
402 payment_expiredMihoatra ny 15 minitra lasa izay nanomboka tamin'ny fanamby. Ny fanamby vaovao dia tonga miaraka aminy. Raha mampiseho ny sary an-tsary fa efa nandray vola ianao, dia miverina ho toy ny fanamby. Miverina amin'ny token (refund_token SY refund_sats Ao anaty fitafiana vita amin'ny lamba.
401 invalid_preimageNy preimage dia tsy mampifandray amin'ny fandoavam-bola hash amin'ny faktiora. Ny fandoavam-bola dia tsy ampiasaina.
401 invalid_payment_credentialNy fampahafantarana dia diso, niova taorian'ny nanambara ny Nymbot, na ny anaran'ny fandoavam-bola hash Nymbot tsy nanambara ny faktiora.
429 rate_limit_exceededMihoatra ny 30 ny fampahafantarana na ny fanalahidy izay tsy nahavita tonga avy amin'ity adiresy ity ao anatin'ny minitra iray, na token fandoavam-bola iray dia nalefa mihoatra ny 60 fotoana ao anatin'ny minitra. 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"));

Ny mpanjifa dia naorina mppx amin'ny fomba Lightning manatanteraka ny fangatahana fandoavam-bola ny tenany; manondro azy ireo amin'ny farany ary aoka izy ireo handoa.

Ny lahatsary

Ny karama POST /videos Ny valiny 202 Tahaka ny tsindry iray, plus a status_url: GET Izany dia voasoratra ary miasa mandritra ny 24 ora, raha mbola voatahiry ny asa.

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

Aoka ny refund_token amin'ny alalan'ny fanehoan-kevitra avy amin'ity valin-teny ity: dia aseho fotsiny eto. Ny lahatsary dia mivoaka (GET /api/v1/l402/refunds Ny valiny "status": "pending"); raha tsy nahavita ny fandefasana, ny fandoavam-bola dia miakatra eo amin'izany. refund_sats ho an'ny asa nandoa vola, fa tsy ny token, noho izany ny fandefasana ny URL dia tsy mizara ny fandoavam-bola.

Ny famerenana

Raha tsy nahavita ny fangatahan'ny fandoavam-bola ary ny mpamatsy dia nahazo ny Nymbot noho ny ezaka, ny fandoavam-bola dia voatahiry ary ny fahadisoana dia milaza izany, amin'ny charged_sats, toy ny amin'ny fangatahana voasoratra anarana. Raha tsy mitranga raha tsy voasoratra, ny fahadisoana dia mitondra Miverina amin'ny token Izany dia mendrika ny vola nomenao:

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

Ny ampahany tsy ampiasaina dia miverina amin'ny fomba mitovy: raha nangataka sary roa ianao ary tsy nahavita ny iray, ny valin'ny fahombiazana nymbot dia mitondra token famerenana ho an'ny tsy misy; transkription izay tsy afaka mamaky ny fe-potoana mialoha no vidin'ny ho ela indrindra ny rakitra mety ho (tsy mihoatra ny 30 minitra), ary ny fahasamihafana amin'ny fe-potoana tena dia miverina ho token famerenana; raha toa ka mihoatra noho ny 30 minitra, dia tsy azo alaina amin'ny 413 ary ny fandoavam-bola manontolo dia miverina. Ny fidirana dia miverina amin'ny zavatra voatahiry. Ny lahatsary tsy nahavita dia miverina amin'ny token niverina.

Ny token fandoavam-bola dia token 256-bit. Ny Nymbot dia mitahiry ny hash ihany, ary mifarana aorian'ny andro 30. Ny token dia mitahiry ny salan'ny sat, ary azonao atao ny:

  • Mandoa vola amin'izany Manolotra Authorization: Bearer REFUND-… ary Salmona niteraka an'i Boaza tamin-dRahaba ; ary Boaza niteraka an'i Obeda tamin-dRota ; ary Obeda niteraka an'i Jese ;refund_token_sats Ao amin'ny nymbot Token kely kokoa noho ny valin'ny fangatahana 402 refund_insufficientNy tsy fahombiazana dia mametraka ny sats indray amin'ny token mitovy.
  • Jereo izany ny GET /api/v1/l402/refunds miaraka amin'ny header mitovy dia miverina {"sats": 237, "status": "open", "expires_at": "..."}.
  • Ny token iray dia azo ampiasaina hatramin'ny 60 fotoana isaky ny minitra.
  • Ataovy eo amin'ny nym izany. Ataovy ao amin'ny Ampiasao ny fanomezana ao amin'ny app Nymbot, na antso POST /api/v1/l402/refunds/redeem Ny a Nanoratra ny fangatahana SY {"refund_token": "REFUND-...", "balance": "standard"} Na ny "pro"Ny valiny manontolo dia mandeha amin'ny salan'ny (10 valin'ny tsirairay amin'ny Standard, 100 amin'ny Pro); valin'ny izay tsy mahatonga ny valin'ny token manontolo ho an'ny fangatahana 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"

Ny valiny

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