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.
Din il-paġna hija tradotta bil-magni għall-konvenjenza. L-oriġinal bl-Ingliż huwa l-verżjoni li tapplika.
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"
}
}
| Status | Meta |
|---|---|
401 | Il-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.
| Kamp | Tip | Meħtieġ | Deskrizzjoni |
|---|---|---|---|
amount | numru | Iva | Kemm, f' currency. Numru sħiħ għal sats. |
currency | String | Le | SATS (id-default), USD jew BTCIl-dollars jiġu konvertiti għat-prezz attwali tal-Bitcoin. |
tier | String | Le | pro (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"
}
| Status | Meta |
|---|---|
400 | Metodu 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). |
429 | Aktar minn 60 fatturi għal dan nym, jew 120 minn din l-indirizz, f'ora waħda (rate_limit_exceeded, b' Retry-After). |
502 | M'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
}
| Status | Meta |
|---|---|
400 | L-id mhux l-id ta' 64 karakter mill-appel tal-ħolqien. |
404 | L-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.
| Kamp | Tip | Meħtieġ | Deskrizzjoni |
|---|---|---|---|
page | integer (query) | Le | Default 1, massim 1,000; paġina ogħla hija 400 invalid_value. |
page_count | integer (query) | Le | Rigħoli għal kull paġna. Default 20, mass 100. |
start_dateend_date | string (query) | Le | Data jewa ħinijiet ISO 8601. |
model | string (query) | Le | Biss dan il-mudell. |
type | string (query) | Le | chat, responses, messages, image, video, speech, transcription jew embedding. |
all_keys | boolean (istaqsi) | Le | B'ċwieċ: true jinkl kull klavijiet tal-istess nym. Default false. |
key_id | string (query) | Le | B'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": "..."
}
ujiżda l-URL sħiħ tal-talba, inkluż il-query string, eżattament kif intunata.methodhuwa l-metodu HTTP.payloadjiżda l-SHA-256 tal-body tal-talba mhux imsejjaħ, f'hex. Huwa meħtieġ fuqPOSTuPATCH, u l-body li tibgħat irid ikun byte għal byte l- wieħed li ħaddimt.created_atgħandu jkun flimkien ma' 60 sekonda minn il-ħin tas-server.- Kull avveniment jaħdem darba waħda, a
GETinkludut, għalhekk header maġkaput ma jistax jiġi ripprodukit mill-ġdid. Imsieħ wieħed ġdid għal kull talba. Żidnoncetag 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.
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.
| Kamp | Tip | Meħtieġ | Deskrizzjoni |
|---|---|---|---|
include_revoked | boolean (istaqsi) | Le | Includes 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.
| Kamp | Tip | Meħtieġ | Deskrizzjoni |
|---|---|---|---|
name | String | Iva | minn 1 għal 40 karakteri, differenti mill-klavi aktivi oħra tiegħek (billi jkun rekognizziment tal-kaxxa). |
limit_sats | integer | Le | Il-limitu tal-ispejdi f'sats, mill-inqas 1. Iħallihha ħali għal ebda limit. |
reset_period | String | Le | daily, weekly jew monthlyBżonnijiet limit_sats__. Leaveha barra għal cap li qatt ma jirissetta. |
expire_at | string jew integer | Le | Meta 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"
}
}
| Status | Meta |
|---|---|
400 | Isem 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). |
429 | Aktar 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.
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.
| Kamp | Tip | Meħtieġ | Deskrizzjoni |
|---|---|---|---|
nwc_url | String | Iva | Il-linja tal-konnessjoni, li tibda nostr+walletconnect://. Nymbot jitlob mill-wallet għal get_info qabel ma jisajjavha, u jistaxħanha inkriptata. |
threshold_sats | integer | Iva | Içeppija meta l-ilważi tnaqqas taħt din il-kwantità ta' sats. Milliminu 1,000. |
topup_sats | integer | Iva | Kemm għandek iżżid kull biċċa. 1,000 għal 1,000,000 sats. |
tier | String | Le | pro (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
}
}
| Status | Meta |
|---|---|
400 | Mhux 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. |
501 | Riċ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.
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:
| Skema | Kapital |
|---|---|
| L402 | Authorization: L402 <macaroon>:<preimage> (LSAT taħdem ukoll) |
| Pagament | Authorization: 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.
| Status | Meta |
|---|---|
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_mismatch | Il-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_expired | Aktar 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_preimage | L-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_credential | Il-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_exceeded | Aktar 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_satsfil-nymbotoġġett). Token li jiswa mniej mill-talba jwieġeb402refund_insufficient; falliment mhux iċċajjata jerġa' iqiegħed is-sats fuq l-istess token. - Iċċekkjah.
GET /api/v1/l402/refundsbil-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/redeembil- 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 } }