Aqbeż għall-kontenut
Lura għal Nymbot

Bażi ta 'għarfien Żviluppaturi

Bilanċ, top-ups u klaviijiet

Iċċekkja dak li għandek, top up permezz ta' Lightning, top up awtomatikament mill-portafoll tiegħek stess, tara kemm kkostaw kull każ, uġġerixxi l-klavi mill-kodiċi.

Kontrollja tal-saldo

It-tnejn tal-bażiċi tiegħek, u kemm mid-limit ta' dan il-klavijiet uża.

GET https://nymbot.ai/api/v1/credits/balance — jeħtieġ ċav API. POST taħdem ukoll, għal klijenti li jistenqewha.

balance iwleż il-bażiżijiet itnein flimkien fid-dollri fuq il-prezz attwali tal-Bitcoin, għal taħditi tal-biża' li jistennew numru wieħed (null jekk il-prezz ma jistax jitqara). Il-bqija huwa f' krediti u sats, li huwa kif il-balanzi huma miġiġi żżommu. key jiddeskrivi l-klavijiet li talbet. Klavix li qasdet il-limitu tagħha għadha tista' tistabbilixxi l-bażi.

Rispons

{
  "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"
  }
}
StatusMeta
401Il-klavijiet m'għandhomx, huma mhux magħrufa, revokati jew skaduti.

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

Metodi ta' pagament

Kif tista' tagħmel top-up, u l-limiti. Lightning huwa l-unika metodi.

GET https://nymbot.ai/api/v1/topup/payment-methods — m'hemmx bżonn klavijiet.

Top-up huwa mill-10 għal 1,000,000 sats; top-up Pro għandu jixtri mill- أقل kredit Pro wieħed, għalhekk jibda mill-100 sats. Il-limiti tad-dollar jsegwu l-prezz tal-Bitcoin. bulk_bonus lista l-kreditu extra fuq top-ups akbar, l-istess kif fl-app: 10%, 15% jew 20% aktar fuq top-ups standard minn 500, 1,000 jew 5,000 sats, u fuq top-ups Pro minn 5,000, 10,000 jew 50,000 sats.

Rispons

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

Top-up permezz ta' Lightning

Jikkrea inviċa Lightning li żżid kreditu lill-nym li l-klavijiet jappartenu li. Pay it from any Lightning wallet, then ċċekkjaha biex jiġi miżjat il-kreditu.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning — jeħtieġ ċav API.

KampTipMeħtieġDeskrizzjoni
amountnumruIvaKemm, f' currency. Numru sħiħ għal sats.
currencyStringLeSATS (id-default), USD jew BTCIl-dollars jiġu konvertiti għat-prezz attwali tal-Bitcoin.
tierStringLepro (id-default) jew standard: f'liema bilanċ imur il-kreditu.

Kreditu standard huwa 10 sats u kreditu Pro 100 sats, plus kwalunkwe bonus għall-kwantità; credits għid x'inhu li se żżid din l-invoċi.

Rispons

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
StatusMeta
400Metodu ieħor fil-pass (unsupported_method), munita mhux magħrufa (unsupported_currency) jew grad, ammont niekuż, jew ammont taħt il-minimun (amount_too_small), fuq 1,000,000 sats (amount_too_large) jew irrifjutat mill-wallet tal-Lightning (amount_out_of_range).
429Aktar minn 60 fatturi għal dan nym, jew 120 minn din l-indirizz, f'ora waħda (rate_limit_exceeded, b' Retry-After).
502M'estewx tiġi magħmula ebda fattura issa (invoice_unavailable, b' 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);

Verifika ta' top-up

Jista' jistaqsi jekk il-fattura ġietx imħallsa u, meta tkun imħallsa, iżid il-kreditu. Il-verifika hija li tikreditaha, għalhekk wara li tħallas, iċċekkja sakemm il-status ikun credited. Xekkija millieta wara huwa sigur: il-kreditu jidħol darba waħda, kemm darba tista' titlob.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — għandu bżonn klavi mill-nym li għamel l-invoċ.

status huwa pending (uċċu ma ġietx paga), paid (imħallas, iżda għadiex ma ġieżx kreditat; iċċekkja mill-ġdid), credited (fuċċ il-bilanċ tiegħek) jew expired (mhux ippagħata fil-ħin). Il-kampijiet tal-balanċ humu għall-livell li l-fattura żżid għalih.

Rispons

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
StatusMeta
400L-id mhux l-id ta' 64 karakter mill-appel tal-ħolqien.
404L-ebda fattura b'dak l-ID għal din il-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);

Istorja tal-query

Rieq waħda għal kull talba: x'kienet, liema mudell, kemm tokens u kemm kkostat. Xejn mill-prompts jew l-imwettaq ma jiġi żżomm, għalhekk l-ebda wieħed ma jiġi rritornat. Ir-rieq jiġu żżammi Pers lillien 90 ijjem, l-ispanijiet il-ġodda l-ewwel. Klave li lqbied il-limitu tiegħu għadu jista' jaqra l-istoriku tiegħu.

GET https://nymbot.ai/api/v1/queries/history — għandu bżonn avviż API key, li jara r-rigwiesti tiegħu stess, jew a talba imxarja mill-ġiectiv tiegħek, li jara kull klavijiet.

KampTipMeħtieġDeskrizzjoni
pageinteger (query)LeDefault 1, massim 1,000; paġina ogħla hija 400 invalid_value.
page_countinteger (query)LeRigħoli għal kull paġna. Default 20, mass 100.
start_date
end_date
string (query)LeData jewa ħinijiet ISO 8601.
modelstring (query)LeBiss dan il-mudell.
typestring (query)Lechat, responses, messages, image, video, speech, transcription jew embedding.
all_keysboolean (istaqsi)LeB'ċwieċ: true jinkl kull klavijiet tal-istess nym. Default false.
key_idstring (query)LeB'talab imxaria, jew b' all_keys=true: biss din il-klavijiet.

Rispons

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

Applikazzjonijiet ta' sigill tal-kontijiet

Il-ħolqien, it-tibdil u r-revoka tal-ikjes, is-sommarju tal-kont u t-top-ups awtomatiċi ma jeħtieġux ikjes API. Jeħtieġu sigatura mill-nym tiegħek, għalhekk ikjes li jifred jista' jispendi sal-limitu tiegħu iżda qatt ma jistgħandu jagħmel ikjes ieħor jew iżid il-limitu tiegħu stess.

L-app tagħmel dan għalik: kollox fil-post tiegħu API is-sheet juża dawn l-endpoints. Għandek bżonn biss din is-sezzjoni biex tgestjoni l-iks mill-kodiċi tiegħek stess.

Is-sigill huwa avveniment Nostr ta' tip 27235 (NIP-98), imbgħut b'encoding base64 fil- Authorization header bil-kelma Nostr quddiem:

L-avveniment

{
  "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 jiżda l-URL sħiħ tal-talba, inkluż il-query string, eżattament kif intunata.
  • method huwa l-metodu HTTP.
  • payload jiżda l-SHA-256 tal-body tal-talba mhux imsejjaħ, f'hex. Huwa meħtieġ fuq POST u PATCH, u l-body li tibgħat irid ikun byte għal byte l- wieħed li ħaddimt.
  • created_at għandu jkun flimkien ma' 60 sekonda minn il-ħin tas-server.
  • Kull avveniment jaħdem darba waħda, a GET inkludut, għalhekk header maġkaput ma jistax jiġi ripprodukit mill-ġdid. Imsieħ wieħed ġdid għal kull talba. Żid nonce tag b'valur każual sabiex żewġ talbiet imminjati fl-istess sekunda għadu jiddifferixxu.
  • Il-body ta' talba imxemmiel jista' jkun massimament 64 KB, u body jeħtieġ Content-Type: application/json.

Event nieqes jirritorna 401 missing_nostr_auth; wieħed li huwa formmat'u ħażin, imxegħet ħażin, ż old demais, jew għal URL, metodu jew body differenti jirritorna invalid_nostr_auth, bil-raġuni fil-messaġġ; wieħa riużata tirritorna nostr_auth_replayed. Avviċċatura API sħiħa mibgħuta għal dawn l-endpoints tiġi rifiċuta. Is-sigatura tiġi verifikata qabel ma jitqara l-body, u kull indirizz jista' jfeli 30 darba kwaċchent minnufih (indirizz IPv6 jiġi kontabbiliti bħala l-kollox /64 tiegħu); wara dan jirrifuta 429 ma' Retry-After.

Il-browser jista' jċempel dawn il-endpoints biss mill-sites proprji ta' Nymbot (https://nymbot.ai, https://nymchat.app u sottomanedji tagħhom). Paġna fuq kwalunkwe sit ieħor ma tirċevix headers ta' CORS rssienx, għalhekk ma tista'xx q nothing li jerġu jkejjsu. Skripti u applikazzjonijiet nativi, li ma jibsux Origin, ma humiex affettwati.

Il-klavijiet sigrieti tiegħek

Is-sigar għandu bżonn il-klavijiet sigrieti tal-nym tiegħek (it- nsec), li jikkontrolla kollox: l-identità tiegħek, l-istorja tiegħek u l-balanċ tiegħek. Put only it in a script on a machine you trust, read it from the environment rather than writing it into the file, and prefer the app when you can.

Dawn l-assistenti jibnu l-header. L-eżempji aktar tard fuq din il-paġna jużawhom. Huma jaqraw il-key sigriet f'hex minn NOSTR_SECRET_HEX; dak ta' cURL juża l- nak għodda tal-linja tal-komand, li tieħu nsec jew hex ċav, u sha256sum (fuq 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");
}

Is-sommarju tal-kont

Dak li l-folja API tal-app turi fuqha: il-key pubbliku tiegħek, iż-żewġ balanċi, kemm hemm keys attivi (mhux revokati jew skaduti), u l- top-up awtomatiku settings, jew null meta s-server ma joffrilhomx.

GET https://nymbot.ai/api/v1/account — għandu bżonn a talba imxarja.

Rispons

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

Ġestjoni tal-klaviijiet

L-endpoints wara lista tal-klavi tal-app. Kollha għandhom bżonn imxajjem tal-joniġKull chiave tiġi ritornata f'dan il-forma, b'ħinijiet f'ISO 8601 u ammonti f'sats:

Oġġett ewlieni

{
  "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 hu sufficient biex jiġi rkonoxxut klavijiet imma mhux biex jiġi użat. Il-klavijiet stess jiġi rritornat chla darba waħda, meta jiġi magħmul.

Lista tal-klaviijiet

GET https://nymbot.ai/api/v1/keys — imxajjem.

KampTipMeħtieġDeskrizzjoni
include_revokedboolean (istaqsi)LeIncludes keys li ġie revokat. Default false.

Rispons

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

Ħ 만들기 ċav

POST https://nymbot.ai/api/v1/keys — immiżjat. Ritorni 201.

KampTipMeħtieġDeskrizzjoni
nameStringIvaminn 1 għal 40 karakteri, differenti mill-klavi aktivi oħra tiegħek (billi jkun rekognizziment tal-kaxxa).
limit_satsintegerLeIl-limitu tal-ispejdi f'sats, mill-inqas 1. Iħallihha ħali għal ebda limit.
reset_periodStringLedaily, weekly jew monthlyBżonnijiet limit_sats__. Leaveha barra għal cap li qatt ma jirissetta.
expire_atstring jew integerLeMeta l-klav jieqef ta' jaħdem: ħin ISO 8601, jew millisekondi minn 1970.

Risposta (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"
  }
}
StatusMeta
400Isem nieqes jew wissiegħ l-ispirazzjoni; isim eżattament u m'għandux jiġi użat għal ieħor (duplicate_name); limit li mhux numru sħiħ ta' millimintru 1; perjodu ta' reset mingħajr limit; skadenza fil-passat; kamp mhux magħruf (unknown_parameter); jew 25 keys attivi diġanti (too_many_keys).
429Aktar minn 60 klaviijiet magħmula minn dan n-nym, jew 120 minn dan l-indirizz, f'ora (rate_limit_exceeded, b' 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);

Qari ta' klavi ewlenija waħda

GET https://nymbot.ai/api/v1/keys/{id} — imxajjem.

Ritiroviet {"data": {…}} bil-oġġett tal-klavijiet, jew 404 key_not_found jekk l-ebda mill-klavijiet tiegħek ma għandu dik l-ID.

cURL

URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
console.log((await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json()).data);

Changing a key 🔑

PATCH https://nymbot.ai/api/v1/keys/{id} — imxajjem.

Ibgħat kwalunkun minn name, limit_sats, reset_period u expire_at, bil-istess regoli bħażżham meta tkun qed tagħmel klavi. null ittara fi: ebda limit, ebda reset, ebda skadenza. Bidelt il-periyodu ta' reset tibda periyodu ġdid minn zero. Klavi rrifukata ma tista'x tinbidel (400 key_revoked). Ritornijiet {"data": {…}} bil-oġġett tal-klavijiet aġġornat.

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

Revoka ta' avveniment ta' chiave

DELETE https://nymbot.ai/api/v1/keys/{id} — imxajjem.

Iwaqqaf il-klavijiet mill-eżatt, għal kollox. Jidħol fil-lista b' revoked_at sett, u jista' jinxema b' include_revoked=trueIt-revoka ta' klav li diġà huwa revokat jagħti l-istess risposta. Jiġu żżamminja biss l-aktar 50 klavijiet revokati li huma l-ġodda; dawk il-qodma jiġu mħassrin meta jitrevoka klav ieħor.

Rispons

{ "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 top-up awtomatiku

Ikkoneġġa wallet Lightning b'Nostr Wallet Connect u Nymbot jitfa' bilanċ misib fuq xogħol meta l-ispejjeż tal-API jġegħlu wowlu. Il-folja tal-API tal-app għandha l-istess settings; dawn huma l-endpoints waraġ. Kollha għandhom bżonn a talba imxarja.

Kif jaħdem: wara li tal-ippeċċell ta' API jiġi ċċarġat fuq il-bażans li għejjert biex tara, jekk dak il-bażans inżel taħt il-limitu tiegħek, Nymbot jagħmel fattura għall-ammont tal-top-up tiegħek, jitlob l-unitt tal-portafoglio tiegħek biex iħallasha, u jżid il-kreditu. Huwa jagħmel top-up l-akbar tliet darba kull 5 minuti għal kull nym u bażans, għalhekk għalxejn ta' mument ta' tal-ippeċċell ma jistax jifflega l-portafoglio. L-𝘪spendenza fl-apps ma tħelsx dan il-proċess. Il-ħin u l-elsejħa tal-aħħar top-up, u l-aħħar żball, huma fis-settings; jekk pagament għadda wara żball, iċċekkja l-fattura tiegħu b' l-istatus tal-top-up kreditiha.

Qabel ma tikkonnettja portafolju

String ta' konnessjoni jippermetti lil kull min għandu dan jista' jistaqsi l-wallet tiegħek biex iħallas. Nymbot jaħżnu emċifrat u jużah biss biex iħallas l-invoices ta' top-up tiegħu stess, iżda agħmel konnessjoni biss għal dan, b'budget ta' spese fil-wallet tiegħek, biex l-akbar xi ħaja tista' tħallas huwa numru li int għaqqajt. L-wallet għandu jappoġġi pay_invoice.

Ikkoneġġa wallet

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — imxajjem.

KampTipMeħtieġDeskrizzjoni
nwc_urlStringIvaIl-linja tal-konnessjoni, li tibda nostr+walletconnect://. Nymbot jitlob mill-wallet għal get_info qabel ma jisajjavha, u jistaxħanha inkriptata.
threshold_satsintegerIvaIçeppija meta l-ilważi tnaqqas taħt din il-kwantità ta' sats. Milliminu 1,000.
topup_satsintegerIvaKemm għandek iżżid kull biċċa. 1,000 għal 1,000,000 sats.
tierStringLepro (id-default) jew standard: il-bażi biex tara u tirriċarikaġġi.

Rispons

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
StatusMeta
400Mhux string tal-konnessjoni (invalid_nwc_url); il-wallet ma weġebx fuq ir-relay tiegħu (nwc_unreachable) jew irrifuża l-ċekk (nwc_rejected); l-konnessjoni ma tistax tħallas fatturi (nwc_missing_permission); jew ammont barra limitijiet.
501Riċarġi awtomatiċi mhumiex attivi għal dan is-server (nwc_unavailable). L-istess japplika għall-ewwel tnejn tal-endpoints l-oħra.

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

Qari tal-settings

GET https://nymbot.ai/api/v1/nwc-auto-topup — imxajjem.

Irritorna l-istess oġġett kif il-konnessjoni, b' connected: false u l-kampijiet l-oħra null meta l-ebda wallet ma jkun konness I. Il-linja tal-konnessjoni stess qatt ma tiġi rritornata.

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

Diċċempelja

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection — imxajjem.

Jiddelta l-connection string mażjorat. M'għandhomx jiġu magħmula aktar top-ups. Biex tkun sigur, tista' tirroka wkoll l-konnessjoni fil-wallet tiegħek.

Rispons

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

Ħlas għal kull petizzjoni mingħajr klavijiet

L-endpoints b'prezzijiet fissi jistgħu jitpayjaw fuq talba waħda għalħax permezz ta' Lightning, mingħajr klavijiet, mingħajr kont u mingħajr saldu: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations u POST /embeddings. Chat, Risposti u Messages sempre jeħtieġu chiave. Request li twaġġeb chiave tiġi fatturata fil-bażi kif normali; il- fluss tal-pagament jibda biss meta ma tingħatx ebda chiave.

Nymbot jitkellem b'żewġ verżjonijiet tal-istess idea, minn backend wieħed: Lightning Labs' L402 (aċċettat ukoll taħt l-ismu l-qadim, LSAT) u d-draft tal-IETF Pagament Skema ta' autentikazzjoni HTTP bil- lightning metodu u charge intentjoni. Uża kwalunkweż li jifhem il-klijent tiegħek.

Ħarriġġjar is-server tiegħek stess

Il-pagament mingħajr klavijiet huwa attiv biss meta API_L402_SECRET li jżomm mill-inqas 32 bajti rindi, bħala hex (64 karakter) jew base64 (44). Agħmel wieħed b' openssl rand -hex 32Valur iqsar jew li jista' jitqagħas iċedi l-karatteristika u jirregistra għaliex. Biex tidrotaha, imexxi l-valur il old le għal API_L402_SECRET_PREVIOUS għal jum: kredenzjali, URLs tal-status u sfidi magħmula taħtha jibqgħu taħdem sakemm jispiċċu.

Il-sfida

Ibgħat ir-reqwejstiet mingħajr nothing Authorization header. Jekk huwa validu, ma jiġri xejn, u tirċievi 402 Payment Required bil-fattura għal eżattament dak li kkostaw dik ir-rejista: l-istess prezz li kiebu jħallsu l-klavijiet, konvertit b'10 sats għal kredit standard jew 100 sats għal kredit Pro u marbut għal sat sħiħ (mill-inqas 1 sat, u mill-inqas il-minimun ta' 0.05 kredit). Ir-risposta ġġorr tliet WWW-Authenticate sfidi għall-istess fattura:

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

Il-Ħlas request il-parametru huwa base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Sfida hija marbuta mal-endpoint, mal- Content-Type (it-tip ta' midja tiegħu u, għal multipart, il-boundary tiegħu) u għall-SHA-256 tal-bytes eżatti tal-body li int għaddit, u dura 15 minuti. Wara li tħallas, ibgħat il- identiku talep għal darbiet oħra: l-istess Content-Type u l-istess bytes JSON, jew għal endpoints multipart (/images/edits, /audio/transcriptions, /audio/translationsl-istess corpo multipart b'lillma l-istess boundary. L-illibreriji HTTP l-aktar jagħżlu boundary ġdid kull lần li jikkodifikaw form, għalhekk ikkoddifikah darba waħda u ibgħat dawk il-bytes żewġxiet.

Mhux kull indirizz jista' jittalab għal 30 sfida kwal minuta (indirizz IPv6 huwa kontat bħala l-imġamla /64 tiegħu). Talb li l-indirizz tagħhom mhux magħruf jikkšerva limitazzjoni aktar stretta ta' 10 kwal minuta, u hemm limit fuq l-isfidi li Nymbot issuġġerixxi minn persuni kollha; talb li jiġi rifjutat qabel ma ssir sfida (لىgur, b'body li mhux JSON valid) ma jikkontaş m'dak. Lil hinn minn hekk il-tweġibja hija 429 ma' Retry-After, imkejja b'qabel ma jiġi mqarri l-body. Endpoints ma' kellhomx ewlenin jew kredenzjali huma kontati wkoll għall-limit ġenerali ta' 120 tal-unauthenticated requests kważi minn kull indirizz. Kredenzjal jiġi verifikat qabel ma jiġi mqarri l-body, u talab li l-suq tiegħu Content-Type mhux application/json (jew multipart/form-data għal uploads) huwa rfiżut b' 415 u qatt ma jirċievi fatura.

L-embeddings huma ipprezzati minn stima tat-tokens fl-input, b'margini ta' 1.5×, għax il-kont aċċurat jkun magħruf biss wara. Int tħallas għat-tokens li ġieħom użati fil-fatt, u l-parti mhux użata mill-pagament tiġi rritornata bħala a token ta' rimborsu.

Issibgħat il-ħlas

Ħallas l-invoċi b'kwalunqa wallet Lightning. Il-wallet jagħtik il-preimage, 64 karatteri hex. Imbagħad ibgħat l-istess talba b'waħda minn dawn:

SkemaKapital
L402Authorization: L402 <macaroon>:<preimage> (LSAT taħdem ukoll)
PagamentAuthorization: Payment <base64url JSON>, fejn jinsab il-JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Rieqgħodja mpayja twieġeb eżattament bħal waħda magħmula b'ċavet */except* li l- nymbot l-oġġett m'għandux kampi ta' bilanċ: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}, u m'hemmx X-Nymbot-Balance-Sats header. A talba maħsuba bil-iskema ta' Pagament jirriflesi wkoll f' Payment-Receipt header (base64url JSON b'l-id tal-challenge, il-hash tal-pagament bħala reference, status u timestamp). Tal-mistoqsijiet ippagħata ma humiex marbuta ma' ebda nym, għalhekk ma jidhrux fil- lista tal-istorja tal-istokkjar.

StatusMeta
402 payment_already_usedĦarġijiet kull pembayaran jħallas għal një nuvensja. Ir-rispons huwa sfida ġdida għal din ir-rewista, għalhekk klient li jikaxxi l-aħħar kredenzjal tiegħu (bħala lnget jagħmel) sempliċement iħallas ienaġor.
402 payment_mismatchIl-kredenzjali ġewa m Isservati għal endpoint ieħor, Content-Type jew il-ġisem, jew jħallas iżqan:</ token ta' rimborsu (refund_token u refund_sats fil-ġisem).
402 payment_expiredAktar minn 15 minuti għaddew minn meta nfetħet il-isfida. Sfida ġdida tiġi magħha. Jekk il-preimage turi li ħallast, dak li ħallast jerġa' jidħol bħala token ta' rimborsu (refund_token u refund_sats fil-ġisem), darba; il-kredenzjal huwa mbagħad uża.
401 invalid_preimageL-immaġni pre-immaġni ma tikklassifikaxx b'hash lejn il-hash tal-pagament tal-fattura. Il-pagament ma ġiex uża.
401 invalid_payment_credentialIl-kredenzjal huwa mdejjaq, inbidel wara li Nymbot ħareġu, jew isemma hash ta' pagament li Nymbot qatt ma ħareġ fattu għalih. Macaroon b'caveat li Nymbot ma jafx, jew b'caveats li jkunru kontradittorji, jiġi rfidut.
429 rate_limit_exceededAktar minn 30 kredenzjali jew l-imkieff li nfaqdu biex jiġu verifikati ġew minn din l-indirizz f'minuta, jew token ta' rimborsu wieħed saret imdqeq minn aktar minn 60 darba f'minuta. Xejx għal 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"));

Klijenti bniet fuq mppx bil-metodu Lightning, humma stabbilixxu l-isfida tal-Pagament; puntaهم lejn l-endpoint u ħalliethom jħallsu.

Vidjows

Ħlasut POST /videos tweġibiet 202 bħal wieħed imkeyyed, plus a status_url: GET mingħajr ebda klavi biex segwi l-impjieg. Huwa mmexxija u taħdem għal 24 sigħat, ditalwa li l-impjieg jiġi żżomm.

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

Żomm il- refund_token minn din ir-rispons: huwa maħsieb biss hawn. Huwa voj empty waqt li il-vidjow jirrendri (GET /api/v1/l402/refunds tweġibiet "status": "pending"); jekollu jekk ir-render jfajla bla bżar, il-pagament jaħbat fuqha. L-URL tal-status turi refund_sats għal xogħol li ġie rrifundat iżda l-token qatt ma ġie, għalhekk il-part👇iżija tal-URL tal-status ma twassalx il-refund. Il-kontroll tal-token jsettja wkoll xogħol fallit li ħadd ma qagħed jikkontrollah.

Rifunżi

Jekk talba paga tfajjet u l-fornitur iċċarġa lil Nymbot għall-istrana, il-pagament jiġi żżomm u l-𝐢l-ħata jgħid hekk, b' charged_sats, eżattament kif għal talba mikkeyjata. Jekk tiflaħ mingħajr ma tiġi fatturata, l-errore jġib token ta' rimborsu valut ta' dak li ħallast:

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

Partijiet mhux użati jirritornaw bil-modistess taxxa: jekk staqsejt għal żewġ ritratti u wieħed falla bla ma ġie binbilt, l-risposta ta' suċċess ta' nymbot l-oġġett iġbid token ta' rimborż għall-parti li nieqes; transkrizzjoni li twilitha ma setgħetx tiddeċiedi minnew hija ipprezzata għall-itwal li l-fajl jista' jkun (li qatt ma jaqta' minn 30 minuta), u d-differenza mal-长度 reali tiġi rritornata bħala token ta' rimborż; jekk jirriżulta li hija aktar minn 30 minuti, tiġi rifjutata b' 413 u l-piżament kollu jerġa' jasal lura. L-embeddings iġġibu l-estimat li kien baqa' wara. Videw fuż falit iċerpja lura l-token li rritornat is-submissjoni tiegħu.

Token ta' rimborż huwa kodiċi aleatorju ta' 256-bit. Nymbot iżżomm biss il-hash tiegħu, u jispiċċa validità wara 30 ijiem. Huwa jżomm bilanċ ta' sat, u tista':

  • Ħallas bih. Ibgħat Authorization: Bearer REFUND-… fuq kwalunkwekwalunkwe mill-endpoints fuq, (l-OpenAI SDK jieħdu bħala l-API key tiegħu). Il-prezz jiġi ħareġ mill- token u dak li jibqa' jibqa' fuqha (refund_token_sats fil- nymbot oġġett). Token li jiswa mniej mill-talba jwieġeb 402 refund_insufficient; falliment mhux iċċajjata jerġa' iqiegħed is-sats fuq l-istess token.
  • Iċċekkjah. GET /api/v1/l402/refunds bil-istess header jirritorna {"sats": 237, "status": "open", "expires_at": "..."}.
  • Token wieħed jista' jintuża għal massimu ta' 60 darba kwatfeyda.
  • Movihha għal nym. Ixgħatlu f' Redemmi rigal fl-app Nymbot, jew telefona POST /api/v1/l402/refunds/redeem bil- talba imxarja u {"refund_token": "REFUND-...", "balance": "standard"} (jew "pro"). Il-krediti kollha marru għall-bażi (10 sats kull wieħed fuq standard, 100 fuq Pro); sats li ma jagħmilux kreditu sħiħ jibqgħu fuq it-token għal talrequests tal-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"

Rispons

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