Pāriet uz saturu
Atpakaļ uz Nymbot

Zināšanu bāze Izstrādātāji

Līdzsvars, top-ups un atslēgas

Pārbaudiet, kas jums ir, pārbaudiet Lightning, pārbaudiet automātiski no sava maku, redzēt, cik katra pieprasījuma izmaksas, un pārvaldīt atslēgas no koda.

Pārbaudiet līdzsvaru

Gan jūsu bilances, gan cik daudz šī atslēgas vāka tiek izmantots.

GET https://nymbot.ai/api/v1/credits/balance Vajadzīga API atslēga. POST Tas darbojas arī klientiem, kas to sagaida.

balance ir divi bilances kopā dolāros pēc pašreizējās Bitcoin cenas, instrumentiem, kas sagaida vienu numuru (null Pārējais ir kredītos un likmēs, kas ir tas, kā bilances faktiski tiek turētas. key atslēga, kas ir sasniegusi savu maksimumu, joprojām var pārbaudīt līdzsvaru.

Atbilde

{
  "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"
  }
}
StatussKad
401Atslēga ir pazudis, nezināms, atsaukts vai beidzies.

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

Maksājuma metodes

Kā jūs varat augšupielādēt, un robežas. zibens ir vienīgā metode.

GET https://nymbot.ai/api/v1/topup/payment-methods Nav nepieciešama atslēga.

Top-up ir 10 līdz 1,000,000 sats; Pro top-up ir jāpērk vismaz viens Pro kredīts, tāpēc tas sākas ar 100 sats. bulk_bonus uzskaita papildu kredītu lielākos top-ups, tāpat kā lietojumprogrammā: 10%, 15% vai 20% vairāk par standarta top-ups no 500, 1000 vai 5000 sats, un par Pro top-ups no 5,000, 10,000 vai 50,000 sats.

Atbilde

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

Augšup pāri zibens

Izveido zibens rēķinu, kas pievieno kredītu nym atslēga pieder. samaksāt to no jebkuras zibens maku, tad Pārbaudiet to Lai kredīts būtu pievienots.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning Vajadzīga API atslēga.

LaukuVeidsNepieciešamsApraksts
amountNumursJāCik daudz, lai currencyPilns skaitlis par likmi.
currencyStringaNēSATS (Tā ir deficīta situācija) USD vai BTCASV dolāri tiek konvertēti pēc pašreizējās Bitcoin cenas.
tierStringaNēpro (par nepilnībām) vai standard: uz kuru bilanci iet kredīts.

Standarta kredīts ir 10 Sats un Pro kredīts 100 Sats, plus jebkura liela apjoma bonuss; credits Pastāstiet, ko šis rēķins pievienos.

Atbilde

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
StatussKad
400Vēl viena metode uz ceļa (unsupported_method, nezināmā valūta (unsupported_currencyIespējams, ka tas ir mazāks vai mazāks par minimālo apjomu (amount_too_small, pārsniedzot 1 000 000 latu (amount_too_large) vai noraidīts ar Lightning maku (amount_out_of_range).
429Vairāk nekā 60 rēķini par šo nym, vai 120 no šīs adreses, stundā (rate_limit_exceeded, ar Retry-After).
502Pašlaik nav iespējams veikt rēķinu (invoice_unavailable, ar 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);

Pārbaudiet top-up

Jautā, vai rēķins ir samaksāts, un, kad tas ir, pievieno kredītu. creditedPēc tam pārbaudiet vēlreiz ir droši: kredīts nokrīt vienu reizi, neatkarīgi no tā, cik reizes jūs lūdzat.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - nepieciešama atslēga no nym, kas izgatavoja rēķinu.

status ir pending (Pagaidām vēl nav samaksāts) paid (maksāts, bet vēl nav kredīts; pārbaudiet vēlreiz), credited (par jūsu līdzsvaru) vai expired (nav samaksāts laikā). bilance laukiem ir par līmeni rēķinu augšgalā.

Atbilde

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
StatussKad
400ID nav 64 rakstzīmju ID no izveidot zvanu.
404Nav rēķina ar šo ID jūsu 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);

Vēlas vēsturi

Viena rinda pēc pieprasījuma: kas tas bija, kāds modelis, cik daudz žetonu un cik tas maksāja. netiek saglabāti nekādi ieteikumi vai atbildes, tāpēc neviens netiek atgriezts. Runas tiek saglabātas 90 dienas, jaunākais vispirms.

GET https://nymbot.ai/api/v1/queries/history — nepieciešama API atslēga, kas redz savus pieprasījumus, vai Parakstīts pieprasījums no jūsu nym, kas redz katru atslēgu.

LaukuVeidsNepieciešamsApraksts
pageVārdu sakot (query)Nēnoklusējuma 1, ne vairāk kā 1000; augstāka lapa ir 400 invalid_value.
page_countVārdu sakot (query)NēRaksti uz lapas. noklusējuma 20, maksimāli 100.
start_date
end_date
String (prasības vārdi)NēISO 8601 datumi un laiki.
modelString (prasības vārdi)NēTikai šis modelis.
typeString (prasības vārdi)Nēchat, responses, messages, image, video, speech, transcription vai embedding.
all_keysLāčplēša diena (query)NēAr vienu atslēgu: true ietver katru atslēgu no vienas un tās pašas nym. false.
key_idString (prasības vārdi)Nēar parakstītu pieprasījumu vai ar all_keys=trueTikai šī atslēga.

Atbilde

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

Parakstīt konta pieprasījumus

Veidojot, mainot un atsaucot atslēgas, konta kopsavilkums un automātiskie top-ups neņem API atslēgu.Viņi ņem parakstu no jūsu nym, tāpēc noplūdušā atslēga var tērēt līdz tās kapitālam, bet nekad nevar veikt citu atslēgu vai palielināt savu kapitālu.

Lietotne dara to par jums: viss savā Ugunsgrēks Sheet izmanto šos gala punktus.Jums ir nepieciešama tikai šī sadaļa, lai pārvaldītu atslēgas no sava koda.

Paraksts ir sava veida Nostr notikums 27235 (NIP-98), kas nosūtīts ar base64 kodēšanu Authorization Header ar vārdu Nostr Uz priekšu :

notikums

{
  "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 ir pieprasījuma pilns URL, ieskaitot vaicājuma virkni, tieši tāpat kā nosūtīts.
  • method Tā ir HTTP metode.
  • payload ir SHA-256 no neapstrādāta pieprasījuma ķermeņa, hex. POST un PATCH, un ķermenim, kuru jūs nosūtāt, ir jābūt byte par byte, kuru jūs hashed.
  • created_at Jums ir jābūt 60 sekunžu laikā no servera pulksteņa.
  • Katrs notikums darbojas vienu reizi, a GET iekļauts, lai uzņemto virsrakstu nevarētu atskaņot. parakstīt jaunu par katru pieprasījumu. nonce Tag ar nejaušu vērtību, lai divi pieprasījumi, kas parakstīti tajā pašā sekundē, joprojām atšķiras.
  • Parakstītā pieprasījuma ķermenis var būt ne vairāk kā 64 KB, un ķermenim ir nepieciešams Content-Type: application/json.

Pazudušais notikums atgriežas 401 missing_nostr_auth; viens, kas ir slikti izveidots, slikti parakstīts, pārāk vecs vai atgriežas citā URL, metodē vai ķermenī invalid_nostr_auth, ar iemeslu ziņojumā; atkārtoti izmantots viens atgriežas nostr_auth_replayedParaksts tiek pārbaudīts, pirms ķermenis tiek izlasīts, un katra adrese to var neveikt 30 reizes minūtē (IPv6 adrese tiek uzskatīta par visu /64); pēc tam tā saņem 429 ar Retry-After.

Pārlūkprogrammas var izsaukt šos gala punktus tikai no Nymbot vietnēm (https://nymbot.ai, https://nymchat.app un to apakšdomēni). lapa jebkurā citā vietnē nesaņem CORS virsrakstus atpakaļ, tāpēc tā nevar izlasīt to, ko viņi atgriežas. OriginTās netiek ietekmētas.

Jūsu slepenā atslēga

Parakstīšanai ir nepieciešama jūsu nym slepenā atslēga (tā ir nsec), kas kontrolē visu: jūsu identitāti, jūsu vēsturi un jūsu bilanci. tikai ievietojiet to skriptā uz mašīnas, kurai jūs uzticaties, izlasiet to no vides, nevis rakstot to failā, un dod priekšroku lietotnei, kad jūs varat.

Šie palīgi veido virsrakstu.Šajā lapā esošie tālākie piemēri tos izmanto.Viņi lasa slepeno atslēgu hexā no NOSTR_SECRET_HEX; cURL viens izmanto Nak komandas līnijas rīks, kas izmanto nsec vai hex atslēgu, un sha256sum uz 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");
}

Konta kopsavilkums

Ko lietojumprogrammas API lapa parāda augšpusē: jūsu publiskā atslēga, abām pusēm, cik atslēgas ir aktīvas (nav atsauktas vai beigušās), un Automātiskais top-up iestatījumi, vai null Ja serveris to nepieprasa.

GET https://nymbot.ai/api/v1/account Vajag a Parakstīts pieprasījums.

Atbilde

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

Atslēgu pārvaldība

Galvenie punkti, kas atrodas aiz lietojumprogrammas atslēgu saraksta. Parakstīts pieprasījumsKatra atslēga tiek atgriezta šādā formā, ar reizēm ISO 8601 un summām sats:

Galvenais objekts

{
  "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 Tas ir pietiekami, lai atpazītu atslēgu, bet neizmantotu to.

Atslēgu saraksts

GET https://nymbot.ai/api/v1/keys Es parakstīju.

LaukuVeidsNepieciešamsApraksts
include_revokedLāčplēša diena (query)NēIekļaut atsauktās atslēgas. noklusējuma false.

Atbilde

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

Izveidot atslēgu

POST https://nymbot.ai/api/v1/keys Atpakaļ - Atpakaļ 201.

LaukuVeidsNepieciešamsApraksts
nameStringaJā1 līdz 40 rakstzīmes, kas atšķiras no jūsu citām aktīvajām atslēgām (neņemot vērā gadījumu).
limit_satsIntegrācijaNēIeguldījumu kapitāls, vismaz 1. atstājiet to bez kapitāla.
reset_periodStringaNēdaily, weekly vai monthlyVajadzība limit_satsAtstājiet to ārā par vāku, kas nekad neatstāj.
expire_atStrings vai integerNēKad atslēga pārtrauc darboties: ISO 8601 laiks vai milisekundes kopš 1970. gada.

Atbilde uz jautājumu (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"
  }
}
StatussKad
400trūkstošs vai pārāk garš nosaukums; jau izmantots vārds (duplicate_name(Pāradresēts no Nīderlandes, kas ir viena no lielākajām Eiropas valstīm, kas nav Eiropas Savienības dalībvalstis, un kas nav Eiropas Savienības dalībvalstis)unknown_parameter); vai 25 aktīvās atslēgas jau (too_many_keys).
429Vairāk nekā 60 atslēgas, kas izgatavotas no šīs nimm, vai 120 no šīs adreses, stundā (rate_limit_exceeded, ar 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);

Lasīt vienu atslēgu

GET https://nymbot.ai/api/v1/keys/{id} Es parakstīju.

Atgriešanās {"data": {…}} ar galveno objektu, vai 404 key_not_found ja nevienam no jūsu atslēgām nav šī 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);

Mainīt atslēgu

PATCH https://nymbot.ai/api/v1/keys/{id} Es parakstīju.

Nosūtīt jebkuru name, limit_sats, reset_period un expire_atar tādiem pašiem noteikumiem kā tad, ja izmantojat atslēgu. null izdzēš lauku: nav ierobežojuma, nav atkārtotas iestatīšanas, nav derīguma termiņa beigām. mainot atkārtotas iestatīšanas periodu, jaunais periods sākas ar nulli. atcelto atslēgu nevar mainīt (400 key_revoked) Atgriešanās {"data": {…}} ar atjaunināto atslēgvārdu objektu.

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

Atcelt atslēgu

DELETE https://nymbot.ai/api/v1/keys/{id} Es parakstīju.

Aizver atslēgu uzreiz, par labu. tas paliek sarakstā ar revoked_at iestatīts, un to var redzēt ar include_revoked=trueTikai jaunākās 50 atceltās atslēgas tiek saglabātas; vecākās tiek dzēstas, kad tiek atcelta cita atslēga.

Atbilde

{ "data": { "id": "4f0c9a1be27d3856", "revoked": true } }

cURL

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

Python

import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())

JavaScript

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

NWC auto-top-up pārdošana

Pievienojiet Lightning maku ar Nostr Wallet Connect, un Nymbot pats izveido līdzsvaru, kad API izdevumi to pazemina. Parakstīts pieprasījums.

Kā tas darbojas: pēc tam, kad API pieprasījums tiek iekasēts uz līdzsvaru, kuru izvēlējāties skatīties, ja šis līdzsvars ir nokritis zem jūsu sliekšņa, Nymbot izraksta rēķinu par jūsu top-up summu, lūdz jūsu maku to samaksāt, un pievieno kredītu. Tas maksimāli palielinās reizi 5 minūtēs par katru nym un bilanci, tāpēc pieprasījumu plūsma nevar iztukšot maku. Iztērēšana lietojumprogrammās to neizraisa. Pēdējā top-up un pēdējā kļūda ir iestatījumos; ja maksājums notika pēc kļūdas, pārbaudiet tā rēķinu ar Top-up stāvoklis Kredīts uz to.

Pirms pievienojiet maku

Nymbot uzglabā to šifrētu un tikai izmanto to, lai samaksātu savus top-up rēķinus, bet izveidojiet savienojumu tikai šim nolūkam, ar izdevumu budžetu jūsu makā, tāpēc visvairāk tas jebkad varētu maksāt ir numurs izvēlējās jūs. pay_invoice.

Pieslēdzot maku

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect Es parakstīju.

LaukuVeidsNepieciešamsApraksts
nwc_urlStringaJāsavienojuma līnija, sākot no nostr+walletconnect://Nymbot lūdz maku get_info pirms to saglabā, un saglabā to šifrētu.
threshold_satsIntegrācijaJāUz augšu, kad bilance nokrīt zem šiem daudziem sats. vismaz 1000.
topup_satsIntegrācijaJāCik daudz katru reizi pievienot. 1000 līdz 1000 000 sats.
tierStringaNēpro (par nepilnībām) vai standard: līdzsvars, lai skatītos un top up.

Atbilde

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
StatussKad
400Nav savienojuma līnijas (invalid_nwc_url(Pāradresēts no Nīderlandes) Nav atbildes uz šo jautājumunwc_unreachable) vai noraidīja pārbaudi (nwc_rejected(Savstarpējā saikne nevar maksāt rēķinus)nwc_missing_permission3) vai arī par summu, kas ir ārpus robežām.
501Šajā serverī automātiskās augšupielādes nav ieslēgtas (nwc_unavailableTas pats attiecas uz pārējiem diviem galamērķiem.

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

Lasīt iestatījumus

GET https://nymbot.ai/api/v1/nwc-auto-topup Es parakstīju.

Atgriež to pašu objektu kā savienošana, ar connected: false Un pārējie lauki null ja nav pieslēgts neviens makiņš, savienojuma virkne pati par sevi nekad netiek atgriezta.

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

Atvienošanās

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection Es parakstīju.

Izdzēš saglabāto savienojuma virkni. vairs netiek veikti augšupielādes. Lai pārliecinātos, varat arī atcelt savienojumu savā makā.

Atbilde

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

Maksājums pēc pieprasījuma bez atslēgas

Fiksētas cenas galamērķus var samaksāt par vienu pieprasījumu vienā reizē, izmantojot Lightning, bez atslēgas, bez konta un bez atlikuma: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations un POST /embeddingsTērzēšanai, Atbildēm un Ziņojumiem vienmēr ir nepieciešama atslēga. Pieprasījums, kurā ir atslēga, tiek ieskaitīts uz atlikumu kā parasti; maksājumu plūsma sākas tikai tad, ja nav nosūtīta atslēga.

Nymbot runā divas versijas par to pašu ideju, no viena backend: Lightning Labs Ls 402 (Pieņemts arī ar savu veco nosaukumu, LSATIETF projekts Maksājums HTTP autentifikācijas shēma ar lightning Metode un charge Izmantojiet to, ko jūsu klients saprot.

Izveidojiet savu serveri

Maksāt bez atslēgas ir tikai tad, ja API_L402_SECRET satur vismaz 32 izlases bytes, piemēram, hex (64 rakstzīmes) vai base64 (44). openssl rand -hex 32Īsāka vai iedomājama vērtība izslēdz funkciju un ieraksta iemeslu. API_L402_SECRET_PREVIOUS uz vienu dienu: statusa URL un izaicinājumi, kas veikti saskaņā ar to, turpina darboties, līdz tie beidzas.

izaicinājums

Sūtīt pieprasījumu ar nē Authorization ja tas ir derīgs, nekas nedarbojas, un jūs saņemsiet 402 Payment Required ar rēķinu par to, ko tieši tas pieprasījums izmaksās: tāda pati cena, ko atslēga maksātu, pārveidots par 10 sats standarta kredītu vai 100 sats Pro kredītu un noapaļots līdz visai sat (vismaz 1 sat, un vismaz 0.05 kredīta minimums). WWW-Authenticate Problēmas ar to pašu rēķinu:

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

Maksājums request Parametrs ir base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

Izaicinājums ir saistīts ar gala punktu, ar Content-Type (viņas plašsaziņas līdzekļu veids un, daudzdisciplīnas gadījumā, tās robeža) un SHA-256 par precīziem ķermeņa bajtiem, ko esat nosūtījis, un ilgst 15 minūtes. identisks Atkārtota pieprasīšana: tas pats Content-Type un tās pašas JSON bytes, vai vairāku daļu gala punktu (/images/edits, /audio/transcriptions, /audio/translationsLielākā daļa HTTP bibliotēku izvēlas jaunu robežu katru reizi, kad tās kodē veidlapu, tāpēc kodē to vienu reizi un nosūta šos bajtus divas reizes.

Katra adrese var pieprasīt 30 izaicinājumus minūtē (IPv6 adrese tiek uzskatīta par tās pilnu /64). Pieprasījumi, kuru adrese nav zināma, dalās stingrāk 10 minūtē, un ir vispārējs ierobežojums par izaicinājumiem Nymbot problēmām visās adresēs; pieprasījums, kas noraidīts pirms izaicinājuma veikšanas (piemēram, ar ķermeni, kas nav derīgs JSON), netiek uzskaitīts. 429 ar Retry-AfterMaksas galamērķi, kas izsaukti bez atslēgas vai sertifikāta, arī tiek skaitīti uz vispārējo 120 neautentificētu pieprasījumu minūtē par adresi. Content-Type nav application/json (vai multipart/form-data par augšupielādi) ir noraidīts ar 415 Un nekad nesaņem rēķinu.

Iebūvējumi tiek aprēķināti, pamatojoties uz ievades žetonu aprēķinu, ar 1,5× maržu, jo reālais skaitlis ir zināms tikai pēc tam. Atgriezties Token.

Maksājuma nosūtīšana

Maksājiet rēķinu ar jebkuru Lightning maku. Maksa dod jums priekšattēlu, 64 hex rakstzīmes. Tad nosūtiet to pašu pieprasījumu ar vienu no šiem:

shēmaHeader
Ls 402Authorization: L402 <macaroon>:<preimage> (LSAT Darbojas arī
MaksājumsAuthorization: Payment <base64url JSON>Kur ir JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

Maksas pieprasījums atbild tieši tāpat kā tas, kas veikts ar atslēgu, izņemot to, ka nymbot objektam nav līdzsvara lauku: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}Un tur nav ne X-Nymbot-Balance-Sats pieprasījums, kas samaksāts ar maksājumu shēmu, saņem arī Payment-Receipt header (base64url JSON ar izaicinājuma id, maksājumu hash kā reference, status un timestampApmaksātie pieprasījumi nav saistīti ar nevienu nišu, tāpēc tie neparādās vaicājumu vēsturē.

StatussKad
402 payment_already_usedKatrs maksājums maksā par vienu pieprasījumu. Atbilde ir jauns izaicinājums šim pieprasījumam, tāpēc klients, kurš kešatmiņā saglabā savu pēdējo sertifikātu (piemēram, lnget Vienkārši atgriežoties atpakaļ.
402 payment_mismatchkredīts tika izsniegts citam galamērķim, Content-Type vai ķermeņa, vai maksā mazāk, nekā šis pieprasījums tagad maksā. jauns izaicinājums šim pieprasījumam nāk ar to; ja maksājums bija pārāk mazs, tas, ko jūs maksājāt, atgriežas kā Atgriezties Token (refund_token un refund_sats un uz ķermeņa)
402 payment_expiredVairāk nekā 15 minūtes ir pagājušas kopš izaicinājuma. ar to nāk jauns izaicinājums. Atgriezties Token (refund_token un refund_sats ķermenī), vienu reizi; pēc tam kredītvēsture tiek izmantota.
401 invalid_preimageIepriekšējais attēls nenorāda uz rēķina maksājuma hash.
401 invalid_payment_credentialKonfidencialitāte ir malformēta, tika mainīta pēc tam, kad Nymbot to izdeva, vai nosaukums maksājumu hash Nymbot nekad nav izdevis rēķinu.
429 rate_limit_exceededVairāk nekā 30 autentifikācijas vai atslēgas, kas neizdevās pārbaudīt, nāca no šīs adreses minūtē, vai viens atmaksas žetons tika nosūtīts vairāk nekā 60 reizes minūtē. 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"));

Klienti ir izveidojuši mppx ar zibens metodi apstrādā maksājumu izaicinājumu paši; norādiet tos uz gala punktu un ļaujiet viņiem maksāt.

Videoklipi

Apmaksāts POST /videos Atbildes 202 kā atslēgu viens, plus a status_url: GET Tas ir parakstīts un darbojas 24 stundas, kamēr darbs tiek saglabāts.

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

Saglabājiet to refund_token no šīs atbildes: tas ir parādīts tikai šeit. Tas ir tukšs, kamēr video rāda (GET /api/v1/l402/refunds Atbildes "status": "pending"); ja rādītājs neizdodas bezrēķinā, maksājums nokrīt uz tā. refund_sats par atmaksātu darbu, bet nekad žetonu, tāpēc statusa URL koplietošana nedalās ar atmaksu.

Atmaksāšana

Ja samaksātais pieprasījums neizdodas un pakalpojumu sniedzējs samaksāja Nymbot par mēģinājumu, maksājums tiek saglabāts un kļūda saka tā, ar charged_sats, tieši tāpat kā atslēgvārdu pieprasījumam.Ja tas neizdodas bez rēķina, kļūda rada Atgriezties Token Tas ir tā vērts, ko esat samaksājuši:

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

Neizmantotās daļas atgriežas tādā pašā veidā: ja jūs pieprasījāt divus attēlus un viens neizdevās bez rēķina, sekmīgā atbilde nymbot objekts nes atmaksas žetonu par trūkstošo; transkripcija, kuras garumu nevarēja izlasīt iepriekš, tiek aprēķināta par garāko failu (ne vairāk kā 30 minūtes), un atšķirība no faktiskā garuma tiek atgriezta kā atmaksas žetons; ja izrādās, ka tas ir ilgāks par 30 minūtēm, tas tiek noraidīts ar 413 un viss maksājums tiek atgriezts. Iebūvējumi atgriež to, ko saglabāja aprēķins. neveiksmīgs videoklips atmaksā savu iesniegumu atgriezto zīmi.

Atmaksas žetons ir nejaušs 256 bitu kods. Nymbot saglabā tikai tā hash, un tas beidzas pēc 30 dienām.

  • Maksājiet ar to. Sūtīt Authorization: Bearer REFUND-… Izvēlieties vienu no šādiem veidiem, kā atbrīvoties no aizcietējumiem, lai atbrīvotos no aizcietējumiem (refund_token_sats Tajā nymbot objekts). žetons, kura vērtība ir mazāka par pieprasījuma atbildēm 402 refund_insufficient; neuzskaitīta neveiksme liek sats atpakaļ uz to pašu žetonu.
  • Pārbaudiet to GET /api/v1/l402/refunds ar to pašu header atgriežas {"sats": 237, "status": "open", "expires_at": "..."}.
  • Viena zīme var tikt izmantota ne vairāk kā 60 reizes minūtē.
  • Pārvietojiet to uz nym. Ievietojiet to Atgrieziet dāvanu Nymbot lietojumprogrammā vai zvanot POST /api/v1/l402/refunds/redeem Ar a Parakstīts pieprasījums un {"refund_token": "REFUND-...", "balance": "standard"} (vai "pro"Visas kredīti iet uz bilanci (10 sats katrs standarta, 100 par Pro); likmes, kas neveido visu kredītu palikt uz žetona API pieprasījumiem.

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"

Atbilde

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