Embohasa pe contenido-pe
Nymbot rembe'uvépe

Arandupykuaaty ñemopyenda Mba'apohára kuéra

Tekove, jepytu'u ha mbojegua

Ehecha ne mba'e, eme'ẽmby Lightning-pe, eme'ẽmby automátikamente ne wallet reheve, ehecha mba'eichaguápa ne request oje'úva, ha emanaje ne keys kódo reheve.

Mbojeréi tesỹre oñembojehe

Pende rembiapo opaite ha mba'éichapa ko tembiapo rekove pe tembiapo mbo'ehaópe.

GET https://nymbot.ai/api/v1/credits/balance — API key oñenondéva. POST oĩma avei, jererekuáva oñomandúva hag̃ua.

balance ha'e umi mokõi mba'e opaite dólar-pe Bitcoin rembiapo tekove ári, mba'e aparaikuã ohechakuaáva peteĩ mba'eichagua kuatia (null syryry rupa ndaikatúi oñeñe’ẽ (syryry rupa ndaikatúi oñeñe’ẽ). Pe oĩva opaite ha'e credits ha sats, ha upéicha oñongatu va'erã umi mba'e oĩva upépe. key emombe'u pe peteĩ tapia oñembojerure va'ekue. Tapia oñembo'e haguãre oñembo'e haguã avei pe mba'e oĩva.

Ñepyrũmby

{
  "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"
  }
}
Teko'oMoõpa
401Pe yvoty oñemissói, ndaikatúi oikuaa, oñembojoapy térã oñemopu'ã oñembotyma.

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

Mbohea rehegua tembiapopy

Mba'éichapa reipyta reñembo'e, ha umi mbojoaju. Lightning ha'e pe única mba'e reheicha.

GET https://nymbot.ai/api/v1/topup/payment-methods — ndojehei'áivi yave.

Peteĩ top-up ha'e 10 peẽnte 1.000.000 sats peve; Pro top-up pe, oĩva peteĩ Pro creditetereíva oñembojegua hag̃ua, upévare oñepyrũ 100 sats-gui. Dollar limit-kuéra oñondiveko Bitcoin rembiapo reheve. bulk_bonus ohechauka pe extra crédito upéicha oĩva app-pe: 10%, 15% térã 20% hetave opaichagua top-up umi 500, 1,000 térã 5,000 sats-gui, ha Pro top-up-pe 5,000, 10,000 térã 50,000 sats-gui.

Ñepyrũmby

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

Mbohovái Lightning reheve

Emoĩ peteĩ Lightning invoice omoañetegua crédito nym-pe pe kave oñe'ẽva, eipytyvõ pe kave, ha eipytyvõ avei opaichagua Lightning wallet-gui, upéi Ehecha oñembojegua hag̃ua pe crédito.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning — API key oñenondéva.

KokuEñe'ẽÑembo'e va'erãÑe'ẽmbotyry
amountpoteheẽMboy, pe ko'ápe currencyPeteve peteĩ mba'e puku sats mba'épa.
currencypuku ñembyatyNahániriSATS (oĩva upéicha), USD ha'e BTCDólar-kuéra oñemohenda Bitcoin eveníva ári reheve.
tierpuku ñembyatyNahániripro (pe oñembojeguaáva) térã standard¿mba'e mba'e rembiapápe oñembosarái pe crédito?

Pe mba'e jepu'áva tee ha'e 10 sats ha pe Pro jepu'áva ha'e 100 sats, ha upéi opa mba'e jepu'áva hetave; credits mba'épa ko kuatia'u oñembojoaju va'erã.

Ñepyrũmby

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
Teko'oMoõpa
400Oimete ambue rehegua ko tape (unsupported_method), peteĩ mba'eichagua pirapire oikua'ỹva (unsupported_currency) térã mbohovái, mba'e oñemboja'o va'ekue, térã peteĩ mba'e oĩva mímimum-gui tekotevẽva térã oĩva mímimum pahápe (amount_too_small), oĩva 1,000,000 sats (amount_too_large) térã Lightning wallet ojerure ha ndaikatúi (amount_out_of_range).
429Resĩ hetave 60-re ko nym-pe, térã 120 ko dirección-gui, peteĩ avekaha mbytére (rate_limit_exceeded, ndive Retry-After).
502Ndaipóri mba'e reipotã oñemohendáva ko'ágã (invoice_unavailable, ndive 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);

Mba'eichaitépa oĩ pe recarga

Oñe'ẽmba peteĩ mba'e kuaa oñe'e hína pe kuatiañe'ẽ oñeipytyvõ haguãicha, ha oñembosako'i avei pe crédito. Ñembosarái haguã ikatu ohecha mba'éichapa oñembosako'i, upévare oñe'ẽmbajánte ohecha hasta pe tendapyre oĩ haguã creditedÑembojerure mósai haguére iporã: pe crédito oñembojoaju peteĩnte, oñe'ẽramo ndéve hetaveveve.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — oĩra niko peteĩ tekove kave pe nym-gui omoĩva pe invoice.

status ha'e pending (ndaha'éi yete) paid (ojepuru, upéicha ndoikotevẽi yet; ejerure upéicha), credited (nde mbo'eha'ỹre) térã expired (ndajepagáiva vérape). Pe mba'e oĩva pe resẽme ha'e pe ñeñongatu oñemboapyháva pe kuatiaguasu.

Ñepyrũmby

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
Teko'oMoõpa
400Pe id ndaha'ei pe 64-character id pe create call-gui.
404Ndaipóri factura upéva id-pe nderehe g̃uarã (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);

Ñe'ẽnga rekove

Pete pe peicha: mba'épa oiko, mba'eichaitépa, mba'eichaitépa ha mba'e hova'a. Ndaipóri prompt térã hesakã oñeñongatuva'erã, upévare ndaikatúi oñemboheraha. Kuatia oĩva oñeñongatu 90 ára, pe oñondivepa ha pe oñepyrũmbajepéva. Peteĩ tekove oñembo'y upéicha oñembo'y haguére, oñemoĩ haguã iñe'ẽ oñeñongatu hag̃ua.

GET https://nymbot.ai/api/v1/queries/history — oñeñandu API key, ohecha itsui hag̃ua iñe'ẽpyrekuéra, térã peteĩ Oñembojererekua pukapy nde nym-gui, ohecháva opaite téke'ỹ.

KokuEñe'ẽÑembo'e va'erãÑe'ẽmbotyry
pageteko'o (pukará)NahániriTekopyre 1, ndaha'ei 1,000-nte; mba'e oĩva upéva peẽme ha'e 400 invalid_value.
page_countteko'o (pukará)NahániriPeicha peicha porandu. Teko 20, upéicha peicha 100.
start_date
end_date
ñe'ẽ (puka)NahániriISO 8601 ára térã ára'ỹ.
modelñe'ẽ (puka)NahániriKo modelo añónte.
typeñe'ẽ (puka)Nahánirichat, responses, messages, image, video, speech, transcription ha'e embedding.
all_keysboolean (pukará)NahániriMba'eichaitépa peteĩ tembiapo: true oñemboherakuaa opaite pe ñe'ẽnguéra oñembojoajáva. Default false.
key_idñe'ẽ (puka)NahániriMombe'urã ryre, térã mbore hérete all_keys=true: ko takuánte.

Ñepyrũmby

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

Mbojerure mba'eapy rekove rekove ñe'ẽme

Mbojoaju, mohendas ha moñemoirũ opaichagua ñe'ẽ, pe cuenta rembiapo ha pe ñembo'e oñembo'e katu ndaha'éi API ñe'ẽ rupive. Oñembo'e peteĩ nym mbojegua rupive, upévare peteĩ ñe'ẽ oñemondisáva ojeipuruta upéi hína iñe'ẽkatu upéicha ndaikatúi omohenda avei ambue ñe'ẽ térã oñembopyahu iñe'ẽkatu.

Tekove ko'ãva ndéve: opaite ihesakãvo API te'i oipuru umi endpoint. Nde reikotevẽmante pe tembiapo ko'ã mba'e rejapóvo umi mba'e reñotỹvo ne kóde rupi.

Pe ñemohu'ã ha'e peteĩ Nostr event kind 27235 (NIP-98), ojehechauka base64-encoded rupive te Authorization ñe'ẽ oĩva ñepyrũmby reheve Nostr míndape:

Ñemongeta

{
  "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 ha'e pe request URL guasu, query string oĩva ndive, opaite mba'e oñe'ẽvaicha omoĩramo.
  • method ha'e HTTP mba'eichagua.
  • payload ha'e pe SHA-256 pe request body tee, hex-pe. Oñe'ẽva oñangarekóva pype POST ha PATCH, ha pe reityvõ tekopa'e oĩva mba'éichapa nde reñeha'ã reñeha'ã ñeñe'ẽmbyre reheve.
  • created_at ha'ãva oñemboty 60 segundógui pe servidor rembiapo mbytépe.
  • Mba'eve mba'e oikove peteĩ hendáicha, a GET oĩ, upéicha peteĩ oñembojerureva'ekue ndaikatúi ojepytave. Emoĩ sỹi ambue peteĩ opaite tembiapo reheve. Emoĩ peteĩ nonce mohendu peteĩ mba'e ndoikuaái mba'eve rehegua upéicha mokõi peteĩ avei katuete mbyky mbytére oñembo'e haguã oñondivepa hína, ikatúvo oñeha'ã oñemohenda.
  • Pe vy'a peteĩ tembiapo oñembo'e hag̃ua ha oñeñotỹva ndaha'éi opaite 64 KB, ha peteĩ vy'a oĩva oñemohenda hag̃ua Content-Type: application/json.

Mba'e oĩva oñemimbi oñemondýi kembali 401 missing_nostr_auth; peteĩva mba'e ndaha'éi porãva, ndoĩ porãva pymaty, ymaiteva, térã ambue URL, mba'eicha térã mba'e reity rehegua oñemoĩ invalid_nostr_auth, pe mba'e oiko hag̃ua pe ñe'ẽme; peteĩ mba'e ojeipurúva kembali oñemonduka kembali nostr_auth_replayedUn API key oñembosarái ko'ã endpoint-pe. Pe signature ojehecha pe body oñemoĩ mboyve, ha avei peteĩ dirección ojejegua 30 ary mbytére minutópe (peteĩ IPv6 dirección oñeñembohovái iñarandu /64-icha); upéi oñemboja 429 ndive Retry-After.

Oñembojeguaapy kuéra oñeñe'ẽta ko'ã endpoint-re Nymbot-taite haguére itsyvoty rehegua (https://nymbot.ai, https://nymchat.app ha iñeỹmby kuéra). Peteĩ kuatia'e ambue sitio rehegua ndojupi CORS headers, upévare ndaikatúi moñe'ẽ mba'e omoĩva. Script-kuéra ha app nativo kuéra, ndojeréiva... Origin, ndaha'éi mba'e oñemombareteva'erã.

Nde mba'e jey hory

Ñembojoaju oĩ vove ne nym's secret key oĩva (te nsec), oĩva oñembopurúva mba'e opaite: ne rembiapo, ne rembiapo yma ha ne pirapire. Emoĩnte peteĩ script-pe machine reñemoĩhápe, eñeñe'ẽse chupe gueteri ambiente-gui ndaha'éi eñombo'e peteĩ tembiapo-pe, ha eipurúvo app-pe eñemoĩramo.

Ko'ã tembiapoapy omoĩ ko header. Ko tembiapo opaite ko ápe oipurúta ko'ãva. Omohenda pe mba'e katu hex-pe... guive. NOSTR_SECRET_HEX; pe cURL oikove peve nak tembiapo command-line, oipurúva nsec térã hex kave, ha sha256sum (macOS-pe, 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");
}

Mbojayhu mba'eichaitépa oĩ

Mba'épa pe app'e API hoja upápe: ne rembiapo poyhu (public key), opa michĩ ha opa guasu, mboyve keys oñembo'e (ndaha'éi ndaihesakãva térã ndopái), ha pe ipota katuete ñembo'e rupive ñe'ẽmbojoaju, térã null meve peẽndivekuéra ndoiporu jave pe tembiapo.

GET https://nymbot.ai/api/v1/account — oikotevẽ Oñembojererekua pukapy.

Ñepyrũmby

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

Mbojegua mba'e kuaa

Pe tendaitype oĩva app rembiapápe tavy kuatiañemohendápe. Opa oikotevẽ peteĩ ñe'ẽmboypy pypeguáichaTekove opaite opaite ko tapicha rupi, avei ára ha orekóva ISO 8601 ha tembiapo sats-pe:

Oĩva mba'e guasu guasu

{
  "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 Iporã oikuaa peteĩ pyta ha ndaikatúi oipuru. Upéva pyta oñemondovia peteĩnte, ojapóramo.

Mbojerovay mbohekove oñeñe'ẽvo

GET https://nymbot.ai/api/v1/keys — oñembojotỹ.

KokuEñe'ẽÑembo'e va'erãÑe'ẽmbotyry
include_revokedboolean (pukará)NahániriEñemboaje mba'e kuaapy oñembopyahéreva. Default false.

Ñepyrũmby

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

Mbojoapy peteĩ yvytu

POST https://nymbot.ai/api/v1/keys — eĩri. Ñemu. 201.

KokuEñe'ẽÑembo'e va'erãÑe'ẽmbotyry
namepuku ñembyatyheẽ1 rupiẽ 40 karaktera, ndoikotevẽ ne rembiapo ambue tekove kave rehe (ndohasãi mba'épa oñeñe'ẽva).
limit_satsinteyérasNahániriPe mbo'eha'ỹ sat ýpe, oñeñe'ẽ porãve 1. Emoĩ hesa'ỹ umi mba'e ndaikatúi oñembo'e.
reset_periodpuku ñembyatyNahániridaily, weekly ha'e monthly. Teko'õ pypykuéra limit_satsJere mboyve peteĩ tembiapo ndajepurupúvapei avei.
expire_atñe'ẽnguéra térã númeroNahániriOñembyatyr when ko pe yvaga oñembo'y: peteĩ ISO 8601 avei, térã milisegundos oñepyrũva 1970 guive.

Respostá (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"
  }
}
Teko'oMoõpa
400Peteĩ ñetérenda oñemboja térã tooí, térã peteĩ ñetérenda oñemongetaite ambue tapicha rehe (duplicate_name); peteĩ tetãndy ndaha'éi peteĩ mba'e porãi oñemonguẽ va'ekue peteĩ gueteri; peteĩ mbojeréi hendápe ndaha'éiva peteĩ tetãndy; peteĩ mba'e oñemopyenda kuaa'ỹva (unknown_parameter); térã 25 opaite tembi'u oĩma katu (too_many_keys).
42960 keys ja'e ko nym ojapova'ekue, térã 120 ko dirección-gui, peteĩ ára rehe (rate_limit_exceeded, ndive 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);

Mba'e ñemonguéra oñe'ẽicha peteĩ mba'e guasu

GET https://nymbot.ai/api/v1/keys/{id} — oñembojotỹ.

Mba'eichaitépa oñembo'yve {"data": {…}} takuã tembiapo ndive, térã 404 key_not_found pembe'ẽramo nderehe mba'eve nderehe reheva even pe id ndaha'éi ne rembiapo.

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

Mohendáiva peteĩ llave

PATCH https://nymbot.ai/api/v1/keys/{id} — oñembojotỹ.

Emboja moĩnte name, limit_sats, reset_period ha expire_at, yemýva mba'eichaitépa oñembohasa jave peteĩ kave ojejapóva. null moĩmbyry peteĩ campo: ndaikatúi upa, ndaikatúi moĩmbyry, ndaikatúi mupyaha. Reñemboja'o pe ñemopyahu ha pe ñemopyahu ha'e peteĩ guive zero-pe. Peteĩ mbojegua'u (key) ndaikatúi reñemboja'o (400 key_revoked). Oñembosarái {"data": {…}} pe tembiapo pyahu mba'e oĩ hag̃ua pe tembiapo pyahu rupive.

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

Mba'e kuaapy rehegua moñe'ẽmbyry

DELETE https://nymbot.ai/api/v1/keys/{id} — oñembojotỹ.

Omoĩ pe yvoty teporãme ko'águi, opa árape. Oĩ hína pe listapy mávo revoked_at mbojoapy, ha oĩta ojere mbytépe include_revoked=trueMba'eve ñemomombo pytu oñemombo jave oñemombo haguére oñeñe'ẽ opaichagua. Ha'e mbytére oñeñe'ẽhápe oñemombo pytu 50eterei; opa mboyve oñemombo pytu oñembojotývo ambue pytu oñemombo hag̃ua.

Ñepyrũmby

{ "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 mbojegua ipu'ãnte

Eñeñongatu peteĩ Lightning wallet Nostr Wallet Connect ndive ha Nymbot omoĩtymba pe pirapire katuete oñembo’e hag̃ua API rembiapo oñembyatyramo. Pe app-pe oĩva API sheet-pe avei peichagua teko; ha’e pe umi endpoint oĩva ihesa'ỹi. Umi oĩ vaípa oĩ peteĩ Oñembojererekua pukapy.

Mba'éichapa oĩ: API peteĩ ñe'ẽ oñembojoapy peẽ omoñe'ẽva reko hag̃ua jave, upéi pe reko oñembojoapy haguã oñembohory peẽ reheve, Nymbot omoĩ peteĩ invoice ne rembiapo oñembojoapy va'ekue hag̃ua, nde wallet-pe oñe'ẽ hag̃ua oipytyvõ hag̃ua, ha omoĩ pe credit. Oñembojoapy opaite peteĩ mba'e upéicha 5 minutu mboyve opaite nym ha reko hag̃ua, upéicha ndaikatúi opaite ñe'ẽ oñe'ẽ hag̃ua omoĩ mboyve ne wallet. Apps rupive oipytyvõ hag̃ua ndaikatúi. Pe ára ha mba'eichaitépa pe último top-up, ha pe último error, oĩ pe settings-pe; upéicha pe peteĩ pymbyry oñembojoapy haguã error pasáva rire, oñe'ẽ i invoice reheve recha'upy resa'ỹi mboavẽ itá.

Eiporé nderehe peteĩ kuatia (wallet) ñemboheraha mboyve

Pete koneksion ñe’ẽ ojehechauka pe oĩva ndive ohecha omoĩ hag̃ua ne rembiapo pe wallet-gui. Nymbot oñeñe’ẽ oñembosarái hag̃ua ha oipurúramo upéva omoĩ hag̃ua iñe’ẽ, ha katu emoheñói peteĩ koneksion ko’ãva reheve pONLY, ne wallet-pe oĩva peteĩ jepu'a, upéicha la oĩva omoĩva guáicha ndereikuaái. Pe wallet oĩva oipytyvõva hag̃ua pay_invoice.

Ñembojoaju peteĩ kuatia purse ha'e mba'e ñembosako'i haguã

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — oñembojotỹ.

KokuEñe'ẽÑembo'e va'erãÑe'ẽmbotyry
nwc_urlpuku ñembyatyheẽPe conexión tembiapo, oñepyrũ nostr+walletconnect://. Nymbot oñe'ẽ umi kuatia purse rehegua get_info oñemoĩ mboyve, ha omoĩ opaite oñeñe’ẽva oñembohorynte.
threshold_satsinteyérasheẽEñombo'e reity pe balance oñembo'y mboyve ko'áicha. Peteĩ oñembo'e avei 1,000.
topup_satsinteyérasheẽMba'éichaitépa oñemboje'a opa mba'e. 1,000 guive 1,000,000 sats.
tierpuku ñembyatyNahániripro (pe oñembojeguaáva) térã standardpe saldo ñamoniñávo ha ñamopavẽvo.

Ñepyrũmby

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
Teko'oMoõpa
400Ndaha'éi peteĩ conexión string (invalid_nwc_url); pe kuatiaha ndoikuaái pe iñe'ẽmbytyre reheve (nwc_unreachable) ha'e recha'upy tseke (nwc_rejected); pe ñembojoaju ndaikatúi omboapy kuatiaha'e (nwc_missing_permission); térã peteĩ kuatiaha mbykymi roryre.
501Ko server rehe ndaha'éi oñemohenda rechargatã oñembohetia (nwc_unavailable). Upéicha avei ambue endpoint-pe.

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

Moñe'ẽ mba'eichaitépa oñembojoaju

GET https://nymbot.ai/api/v1/nwc-auto-topup — oñembojotỹ.

Omoñe'ẽ avei pe hendaitéicha oñemohendáva, ndive connected: false ha ambue opaitekuéra null ndajeyruí hag̃ua wallet mba'eve ndaikatúi oñeñongatu. Pe connection string ndaikatúi oñeñongatu mbahéichapa.

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

Moĩmbyryvo

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection — oñembojotỹ.

Oñemoi pe koneksion string oĩva. Upéicha ndoikái ave'e reka'u. Ehecha hag̃ua porãve, reñemoi ave'e pe koneksion ndere wallet-pe.

Ñepyrũmby

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

Omoĩ porandu porandu ndaha'éivante peteĩ mba'eichaukauha rehegua

Pe ipia'ỹva mbojerure oñeñe'ẽ porãnte peteĩ rehegua Lightning-pe, ndaha'eihei umi mba'e: ndaha'eihei peteĩ tekove, ndaha'eihei peteĩ account ha ndaha'eihei peteĩ mba'eichagua pirapire: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations ha POST /embeddings. Chat, Respuestas ha Mesahes ryakuãitéicha peteĩ tembiapo (key) hekãnte. Peteĩ puruhá (request) oñondive peteĩ tembiapo oĩramo, ojapoicha oñembosarái pe balance-pe; pe mbopegua (payment flow) oñepyrũmante oĩramo peteĩ tembiapo ndoikuaái.

Nymbot ñe'ẽsarái mokõi versión opaite hendáicha, peteĩ backend-gui: Lightning Labs' L402 (upéicha avei oñeha'ã upéva ñe'ẽtyre rupive,) LSAT) ha IETF draft Pagapy HTTP authentication esquema ndive pe lightning método ha charge mba'éichapa reñandu. Eipuru mba'éreicha ne mba'aty oikuaáva.

Eñemoĩvo nde téraichagua server

Mba'eichaitépa oñeñombyaty peicha ndaha'éi peteĩ yvytu oĩramo API_L402_SECRET ojuru 32 random bytes, hex-pe (64 characters) térã base64 (44). Eheja peteĩ: openssl rand -hex 32. Pete mba'e oñemboja'o térã oñeñemohenda hag̃ua mba'eichaitépa oĩ, upéicha oñemboty pe feature ha ohechauka mba'ére. Upéicha oñemongu'e hag̃ua, emoĩ pe mba'e oĩva upépe... API_L402_SECRET_PREVIOUS tepy ma'ẽramo peteĩ árape: credentials, status URLs ha jerovavy ojejapóva upéicha oikove avei upépe oñemopyendávo peve.

Tembiapo mba'épa

Emsẽ umi rogaskue ndaha'ei mba'e ndereheveve Authorization Tetea. Oiporãramo, ndatendevei mba'eve, ha reipota 402 Payment Required hesakuã peteĩ factura upéva rembiapo akãite haguãitéicha: upéicha chéngue piko peteĩ key oĩva, converted 10 sats peteĩ credit yvoty reheve térã 100 sats peteĩ Pro credit reheve ha upéva omomba'e peteĩ sat (peteĩ sat térã, ha upéva 0.05 credit mínimo reheve). Pe syryry oguerekóva mbohapy WWW-Authenticate mbojeroviakuéra avei ko mba'e rekove (invoice) rehegua:

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

Pe Mombyry request parameter ha'e base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Peteve ha'e oñembo'y pe paha, pe Content-Type (i-media type ha, multipart-pe g̃uarã, i-boundary) ha i-SHA-256 oĩva pe rembe'u bytes porãite re-enviáva, ha oĩ 15 minutu. Re-ipyruvo jave, re-enviáta... ojotopáva Eipuru jey: upéicha Content-Type ha avei pe JSON bytes oñeñe'ẽva, térã multipart endpoints upe reheve (/images/edits, /audio/transcriptions, /audio/translations) upéicha avei pe multipart cuerpo opaite hendáicha pe hendáicha boundary-re. Library HTTP opaite oñemongeta peteĩ boundary pyahu opaite ẽndekóvo peteĩ form, upévare ẽndekoe peteĩ ja'e ha eñomýi pe bytes mokõi hendáicha.

Pe opaite rupi'ã oñe'ẽ porã 30 tembiapo pytũ mbytére (IPv6 rupi'ã oñe'ẽ peteĩ /64 rupi'ã) Pe rupi'ã ndoikuaái rupi'ã ha katu oñe'ẽ pytũve 10 mbytére, ha oĩ peteĩ opaite mbojojára Nymbot omoĩva opaite rupi'ã rehe; peteĩ ñe'ẽ ndoikuaái mboyve tembiapo pytũ ojejapóvo (upéicha, peteĩ JSON ndoipotéiva) ndoñe'ẽi umi tembiapo rehe. Upéicha upéicha pe syry ha'e 429 ndive Retry-After, oñembohasa pe tembiapo ñanembo'e haguã mboyve. Oñeñe'ẽ avei hendáicha umi endpoint oñembo'e ndaha'éi tembiapo pyhareve térã mba'ehechauka ndaha'éigui, ha upéva oñembojoaju pe ipu'aka 120 pypa peteĩ mbytére peteĩ direcciónpe. Tembiapo oñehetũ mboyve pe tembiapo oñeñe'ẽ haguã, ha peteĩ tembiapo upéicha Content-Type ndaha'éi application/json ( térã multipart/form-data reko'i ha upeve ha'e ndaha'éi nde reiko'i ndave ha'e... 415 ha ndaikatúi ojuhu peteĩ factura.

Embeddings-pe oñembojerure oñembohetũgui pe input-pe oĩva tokens, 1.5-ve guata, upéicha pypa oikuaáramo mba'eichaitépa hague. Nde reity húva tokens-pe añetete, ha pe ndereityjýi mba'e oñembojehevo oúma... mbyja tembi'u.

Amo'ẽ hína pe pirapire

Pytyvõ peẽme peẽ remelda rupive avei peteĩ Lightning wallet-rã. Pe wallet ome'ẽ ndéve pe preimage, 64 hex characters. Upéi eñe'ẽ avei ko'ãva reheve:

TesaÑepyrũmbypýre
L402Authorization: L402 <macaroon>:<preimage> (LSAT oñemohendáma avei)
PagapyAuthorization: Payment <base64url JSON>, mba'éichapa pe JSON oĩva {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Peteĩ jerureku mbo'eha'ã hi'upy hína mba'éichapa peteĩ jerureku jerovia tapiaite, upéicha laicha, upéicha haguante... nymbot objéto ndoñe'ẽi mba'eichaitépa oĩ hekuã: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}, ha ndaikatũi X-Nymbot-Balance-Sats header. A pepyte'ỹ oñemoĩ hag̃ua Pe Pytyvõ rupi oñemboja avei peteĩ Payment-Receipt header (base64url JSON reheve challenge id, pe pyménto hash g̃uarã reference, status ha timestamp). Ñembojerurekuéra oñe'ẽva rupive oĩva rembiapo rehegua ndoñe'ẽi avei nym-re, upévare ndohechái query history-pe.

Teko'oMoõpa
402 payment_already_usedMba'eve mba'eichaicha'ỹicha omboja'o peteĩ tembiapo rehegua. Pe ára mimbíva'ekue ha'e peteĩ tembiapo pyahu ko tembiapo rehegua, upévare peteĩ cliente omoĩva'ekue iñe'ẽmby (as lnget oipurúnte avei.
402 payment_mismatchPe mba'e hesakãva opaite avei ambue endpoint-pe g̃uarã, Content-Type ñande rete, térã oipytyvõve ko tembiapo ko'ágã mba'éichapa ojehecha. Tekombo'e pyahu ko tembiapo reheve; upéicha ojehecha katu pe pymétapy oĩramo oĩ porãnte, pe oipytyvõva peẽme oúta hag̃ua peteĩ mbyja tembi'u (refund_token ha refund_sats tekopyre mévo.
402 payment_expiredPia mbykymi 15 ára oñemboja mboyve umi tembiapo. Peteĩ tembiapo pyahu oúma upéicha. Ko preimage ohechauka hag̃ua reikombo'e, pe reikombo'e oúma peteĩ... mbyja tembi'u (refund_token ha refund_sats tekopy rupi), hesakãvo; mba'erehegua oipurúma.
401 invalid_preimagePe preimage ndaha'éi pe factura rembiapo hash-pe. Pe rembiapo ndou'u'ai.
401 invalid_payment_credentialPe mba'e porandu ndaha'éi porãva, omoĩvo Nymbot omohenda rire, térã oñe'ẽ peteĩ pymbe'uvoty Nymbot ndoikotevẽva mba'eichagua pymbe'uvoty reheve. Macaroon peteĩ mba'e omohendáva Nymbot ndojaikaróiva, térã umi mba'e omohendáva oñemondýiva, oñemboja'o.
429 rate_limit_exceededHeimbi 30 ypavẽve credentials térã keys oñembojere va'ekue oñeñemohendáva ko direcciónpe peteĩ mimbity reity rupi, térã peteĩ refund token oñembojeréi hetave 60 ary mimbity reity rupi. Ejerure 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"));

Klientekuéra ojejapose: mppx Lightning mba'eichaitépa oñemohenda pe Ñembo'e pymba'eryry rehegua mba'eichaitépa oñeñongatu upéicha; emoĩ chupekuéra pe endpoint-pe ha ejeje hikuái omoĩ hag̃ua pe pirapire.

Vídeos

Omoĩ mbarete POST /videos mbojerovayhuetápe 202 óicha peteĩ mba'e oñembo’yva, ha peteĩ avei status_url: GET ndaha'ei peteĩ mba'e oñeñandu hag̃ua tembiapópe. Oñembojotýi ha oĩ porãve 24 ára, ko'ãme oĩ porãve pe tembiapo oñemotenondehápe.

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

Mba'e ñemongu'e refund_token ko'ãg̃vápe reñeñandu añete: ohechauka añete ko'ápe guarã. Oñembohory ha oñembohasa rire pe vídeopy*)GET /api/v1/l402/refunds mbojerovayhuetápe "status": "pending"); pe render oñemboja'ỹramo, pe pymba'e oity upépe. Pe URL status oka'e refund_sats jepy'apy va'ekue peteĩ mba'e oje'emo hag̃ua, ha ndaha'éi pe token, upévare pe status URL omoĩramo ndaha'ei pe jepy'apy. Pe token ohechakuaa avei peteĩ mba'e oñemoirũva ndohupytyíramo mba'eve ohechakuaáva.

Ñemomombyrykuéra

If peteímeva rembarete oñemoĩ ha pe provider Nymbot-pe oipuru hag̃ua pe tembiapo, pe pirapire oĩ hína ha pe erro ohechauka avei, pe... charged_sats, ipuichagua peteĩ requerimiento techapyrãicha. Ha katu oñemoirũ ndereikuaãi mboyve, pe erro oguereko peteĩ mbyja tembi'u ha'e pe réicha reñe'ẽva:

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

Pe mba'e ndajerevéi ndiveichante: oĩramo ndereka hag̃ua mokõi ta'anga ha peteĩ ndoiporãi ndereko'i hag̃ua, pe mba'e iporãva'ekue'ỹ ningo nymbot objetoha omog̃uapy peteĩ refund token pe oñemboja va'ekue rehe; peteĩ transcriptionete pe oñeñanduramo pe oĩva oñeñandu haguére, oñemboja pe oĩva oñongatu hag̃ua (ndaha'éi upéicha 30 minutos-pyre), ha pe oĩva oñemboja ha pe oĩva opaite oñembotyve haguã oĩ peteĩ refund token; amoĩramo upéicha oĩ 30 minutos-pyre, oñemboja'ỹ va'erã... 413 ha opaite pe mba'e ojeipuru va'ekue oúma avei. Embeddings omoĩ kembali pe mba'e ojehecha va'ekue ojeheja va'ekue. Peteĩ vídeo oñembyasyva omoĩ kembali pe token oñemoĩ va'ekue.

Pe refund token ha'e peteĩ kódigo 256-bit random. Nymbot oñongatu pe i'e ha'e haguére añónte, ha upéva omoĩ 30 ára mboyve. Oñongatu peteĩ sat balance, ha reity:

  • Emuña hese. Emsẽ Authorization: Bearer REFUND-… ko'ãva reĩva opaite endpoint-icha (OpenAI SDK oipytyvõ chupe API key-ramandu). Pe retã oñembojoaju pe token-gui ha opaite oĩva oĩ upépe (refund_token_sats tekovepe nymbot objeto). Peteĩ mba'e porandu oĩva opaite mba'e reheve hetave oñeñe'ẽramo ha oñe'ẽmbajepa ndive. 402 refund_insufficient; peteĩ mba'e ojejapo'ỹva ndajehechaukái'ỹva, jepu'ã henondépe avei pe tembiapo oñeñe'ẽva haguã.
  • Ehecha. GET /api/v1/l402/refunds hendive pe mba'e opaichagua he'íva jere {"sats": 237, "status": "open", "expires_at": "..."}.
  • Peteichagua peteĩ ojeipuru upéicha 60 aryve minutopa.
  • Eñembojerovia peteĩ ñemyndu'ápe. Emoĩ chupe Eipota peteĩ regalo Nymbot app-pe, térã jaipy'ũ. POST /api/v1/l402/refunds/redeem peteĩndive Oñembojererekua pukapy ha {"refund_token": "REFUND-...", "balance": "standard"} ( térã "pro"). Pe mba'e porãite oñembopoty pe balance-pe (10 sats pe ojehechauka standard-pe, 100 Pro-pe); pe sats ndaha'éiha peteĩ mba'e porãite oĩva pe token-pe API request-kuérape g̃uarã.

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"

Ñepyrũmby

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