გადადით შინაარსზე
დაბრუნება Nymbot

ცოდნის ბაზა განვითარებლები

ბალანსი, Top-ups და Key

შეამოწმეთ, რა თქვენ გაქვთ, გააუმჯობესეთ Lightning, გააუმჯობესეთ ავტომატურად თქვენი საკუთარი პაკეტში, იხილეთ, რა ყოველ მოთხოვნას ღირს, და მართეთ კურსი კოდიდან.

შეამოწმეთ ბალანსი

ორივე თქვენი ბალანსი, და თუ რამდენად ამ key- ის კაბა გამოიყენება.

GET https://nymbot.ai/api/v1/credits/balance საჭიროა API Key. POST ასევე მუშაობს, კლიენტებს, რომლებიც მოითხოვს.

balance არის ორი ბალანსი ერთად დოლარში ამჟამად ვიკიპედია ფასი, ინსტრუმენტები, რომლებიც მოითხოვს ერთი ნომერი (null თუ ფასი არ შეუძლია წაიკითხოთ). სხვა არის კრედიტები და ფასი, რომელიც არის, თუ როგორ ფულადი რეალურად შეინარჩუნება. key კლიენტს, რომელიც მოითხოვს კლიენტს. კლიენტს, რომელიც შეესაბამება მისი კაბა, ასევე შეუძლიათ შეამოწმოს ბალანსი.

პასუხი

{
  "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"
  }
}
სტატუსიროდესაც
401KEY არ არსებობს, არ არის ცნობილი, შეუზღუდავი ან დასრულდა.

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

გადახდის მეთოდები

How can you top up, and the limits. Lightning არის მხოლოდ მეთოდი.

GET https://nymbot.ai/api/v1/topup/payment-methods არ არის აუცილებელი KEY.

Top-up არის 10 to 1,000,000 sats; Pro-top-up უნდა შეიძინოთ მინიმუმ ერთი Pro საკრედიტო, ასე რომ ეს იწყება 100 sats. დოლარი შეზღუდვა შემდეგ ვიკიპედია ფასი. bulk_bonus შეიცავს დამატებითი კრედიტი უფრო დიდი top-ups, იგივე როგორც app: 10%, 15% ან 20% მეტი სტანდარტული top-ups from 500, 1,000 ან 5,000 sats, და Pro top-ups from 5,000, 10,000 ან 50,000 sats.

პასუხი

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

Topping Up Over Lightning-ის ზედაპირზე

გააკეთებს Lightning ფულადი, რომელიც დაამატებს საკრედიტო ნომერი, რომ კურსი მოიცავს. გადაიხადოს იგი ნებისმიერი Lightning ფულადი, მაშინ შეამოწმეთ კრედიტის დამატება უნდა იყოს.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning საჭიროა API Key.

ფართობიტიპიმოთხოვნააღწერა
amountნომერიდიახთუ რამდენად, იმ currencyდაახლოებით 1 რაოდენობა.
currencyStringარSATS (სამთავრობო სიჩქარე) USD ან BTCდოლარი გადაიხადოს ამჟამად ვიკიპედია ფასი.
tierStringარpro (სამთავრობო დასაწყისში) ან standard: რა ბალანსი კრედიტი იწვევს.

სტანდარტული კრედიტი არის 10 sats და Pro კრედიტი 100 sats, plus ნებისმიერი ბონუს; credits რა თქმა უნდა, რა თქმა უნდა, რომ ეს ანგარიშის დამატება.

პასუხი

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
სტატუსიროდესაც
400სხვა მეთოდები გზა (unsupported_method), რომელიც არ არის ცნობილი ვალუტა (unsupported_currency) ან ხარისხი, შეუზღუდავი რაოდენობა, ან რაოდენობა ქვემოთ მინიმალური (amount_too_small(დაწვრილებით დაახლოებით 1 მილიონი ტანსაცმელი)amount_too_large) ან უარყოფითი ბეჭდვის ბეჭდვა (amount_out_of_range).
429მეტი 60 ანგარიშები ამ ნომერი, ან 120 ამ მისამართზე, ერთი საათის განმავლობაში (rate_limit_exceededერთად Retry-After).
502ამჟამად არ შეიძლება გამოქვეყნდეს ანგარიშები (invoice_unavailableერთად 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);

შეამოწმეთ Top-Up

კითხვებს, თუ ფულადი გადახდის და, როდესაც იგი აქვს, დაამატა საკრედიტო. შეამოწმეთ, რა კრედიტი, ასე რომ გადახდის შემდეგ, შეამოწმეთ, სანამ სტატისტიკა არის creditedგადარჩენა შემდეგ არის უსაფრთხო: საკრედიტო დატვირთვა ერთხელ, მიუხედავად იმისა, რომ მრავალჯერობით გთხოვთ.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - საჭიროა ნომერი ნომერი, რომელიც აწარმოებს ანგარიშს.

status ეს pending (სამად არ გადაიხადეთ) paid (სხლა, მაგრამ ჯერ კიდევ არ დარეგისტრირებულია; შეამოწმეთ კიდევ ერთხელ), credited (და თქვენი ბალანსი) ან expired (სამოვნოდ არ გადაიხადეთ დროში). ბალანსი ფართობი არის ფასი, რომელიც ფასი აღემატება.

პასუხი

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
სტატუსიროდესაც
400ID არ არის 64-იანი ID, რომელიც შექმნილია.
404არ არის ნომერი ამ ID თქვენი ნომერი (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);

გსურთ ისტორია

ერთი ხაზი მოთხოვნით: რა იყო, რა მოდელი, колико токенов и что это стоило. არ არის მოთხოვნა ან პასუხი არ არის შენარჩუნებული, ასე რომ არ არის დაბრუნებული. ხაზი შენარჩუნება 90 დღის განმავლობაში, უახლესი პირველი. კურსი, რომელიც შეესაბამება მისი ხარისხი, ჯერ კიდევ შეგიძლიათ წაიკითხოთ მისი ისტორია.

GET https://nymbot.ai/api/v1/queries/history — საჭიროა API key, რომელიც იხილავს საკუთარი მოთხოვნებს, ან შეტყობინება თქვენი ნომერი, რომელიც ხედავს თითოეული კურსი.

ფართობიტიპიმოთხოვნააღწერა
pageშეტყობინება ( Query )არსტანდარტული 1, მაქსიმალურად 1000; უფრო მაღალი გვერდზე არის 400 invalid_value.
page_countშეტყობინება ( Query )არფურცელი ფურცელი ფურცელი ფურცელი ფურცელი ფურცელი ფურცელი ფურცელი ფურცელი ფურცელი ფურცელი
start_date
end_date
String – კითხვებიარISO 8601 თარიღი და დრო.
modelString – კითხვებიარმხოლოდ ეს მოდელი.
typeString – კითხვებიარchat, responses, messages, image, video, speech, transcription ან embedding.
all_keysBoolean (სურცელი)არერთი კურსი: true შეიცავს თითოეული კურსი იგივე nimm. default false.
key_idString – კითხვებიარშეტყობინება, ან შეტყობინება all_keys=trueმხოლოდ ამ კლიენტს.

პასუხი

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

ანგარიშის შეტყობინება

ფუნქციონირება, შეცვალოს და აღიარება კურსი, ანგარიშის შეტყობინება და ავტომატური top-ups არ მიიღოს API კურსი. ისინი მიიღოს შეტყობინება თქვენი nimm, ასე რომ ფუნქციონირებული კურსი შეიძლება გადაიხადოს მისი კაბა, მაგრამ ვერ გააკეთოს კიდევ ერთი კურსი ან გაზრდის საკუთარი კაბა.

ეს არის ეს, რაც პროგრამა გააკეთებს თქვენთვის: ყველაფერი მისი ამინდი ფურცელი იყენებს ამ Endpoints. თქვენ უბრალოდ უნდა ამ სექციაში მართოთ ფურცელი თქვენი საკუთარი კოდი.

დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში Authorization Header ერთად სიტყვა Nostr წინასწარ :

Event

{
  "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 არის კითხვის სრული URL, კითხვის string მოიცავს, ისევე, როგორც გამოგზავნილია.
  • method ეს არის HTTP მეთოდი.
  • payload ეს არის SHA-256 ნედლეულის მოთხოვნების სხეულის, hex. ეს მოითხოვს POST და PATCH, და სხეულის თქვენ გადაცემთ უნდა იყოს byte- ის byte, რომელიც თქვენ hashed.
  • created_at უნდა იყოს 60 წამში სერვერზე.
  • ყველა მოვლენები მუშაობს ერთხელ, a GET შეიცავს, ასე რომ ჩართული ჰიდრავლიკაცია არ შეიძლება გადაიხადოს. დარეგისტრირეთ ახალი თითოეული მოთხოვნით. nonce იმიტომ, რომ ორი მოთხოვნა, რომელიც იგივე წამში დაარსდა, ჯერ კიდევ განსხვავდება.
  • კონტაქტი შეიძლება იყოს მინიმუმ 64 KB, და კონტაქტი უნდა იყოს მინიმუმ Content-Type: application/json.

გამოქვეყნდა The Missing Event Returns 401 missing_nostr_auth; ერთი, რომელიც არ არის მორგებული, არ არის მორგებული, ძალიან ძველი, ან განსხვავებული URL, მეთოდის ან სხეულის მიწოდება invalid_nostr_auth, მიზეზით შეტყობინება; ერთ-ერთი რეიტინგული იღებს nostr_auth_replayedAPI Key, რომელიც გამოგზავნილია ამ Endpoints, არ არის დატოვებული. შეამოწმება შეამოწმებულია, სანამ სხეულის იხილება, და თითოეული მისამართი შეიძლება შეუწყოს 30 წუთში (IPv6 მისამართი ითვლება, როგორც მისი მთელი /64); მას შემდეგ, რაც მას იღებს 429 ერთად Retry-After.

ბრაუზერები შეუძლია ამ Endpoints მხოლოდ Nymbot- ის საკუთარი საიტებზე (https://nymbot.ai, https://nymchat.app და მათი დომენები). გვერდზე ნებისმიერი სხვა საიტზე არ იღებს CORS headers უკან, ასე რომ მას არ შეუძლია წაიკითხოთ, რაც ისინი გადაიხადოს. სკრიპები და მობილური პროგრამები, რომლებიც არ გაგზავნათ Originარ არის გავლენა.

თქვენი კერძო კლიენტები

შეტყობინება მოითხოვს თქვენი NIM- ის სექსუალური Key (The Secret Key) nsec), რომელიც კონტროლებს ყველაფერი: თქვენი Identity, თქვენი ისტორია და თქვენი ბალანსი. უბრალოდ დააყენეთ ეს სკრიპში მანქანაში, რომელიც მოგცემთ, წაიკითხეთ ეს გარემოში, ვიდრე წაიკითხეთ ეს ფაილი, და prefer the app when you can.

ამ მხარდაჭერები შექმნათ სატვირთო. შემდეგ მაგალითები ამ გვერდზე გამოიყენება მათ. ისინი წაიკითხე სატვირთო key in hex from NOSTR_SECRET_HEX; cURL ერთი გამოიყენება ქმარი ოპერაციული ინსტრუმენტი, რომელიც იღებს nsec ან hex key, და sha256sum (სამთავრობით, რომ 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");
}

ანგარიშის შეფასება

ის, რაც პროგრამის API ფურცელი აჩვენებს ზედაპირზე: თქვენი Public Key, ორივე შეესაბამება, რამდენიმე ფურცელი ეფექტურია (არ არ გაქირავებული ან დასრულდა), და ავტომატური Top-Up კონფიგურაცია, ან null როდესაც სერვერები არ გთავაზობთ.

GET https://nymbot.ai/api/v1/account საჭიროა a შეტყობინება.

პასუხი

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

ძიება Key

სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის სინათლის... შეტყობინებათითოეული კურსი იღებს ამ ფორმაში, დროები ISO 8601 და რაოდენობა sats:

ძირითადი Object

{
  "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 ეს არის საკმარისი, რომ აღიაროთ კურსი, მაგრამ არ გამოიყენოთ იგი. კურსი მხოლოდ ერთხელ, როდესაც იგი შექმნილია.

ლიტერატურა KEY

GET https://nymbot.ai/api/v1/keys დაარსდა

ფართობიტიპიმოთხოვნააღწერა
include_revokedBoolean (სურცელი)არშეიცავს შეუზღუდავი keys. Default false.

პასუხი

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

გაკეთება Key

POST https://nymbot.ai/api/v1/keys დასაწყისში დასაწყისში 201.

ფართობიტიპიმოთხოვნააღწერა
nameStringდიახ1 - 40 სიმბოლოები, განსხვავებული თქვენი სხვა აქტიური კლიენტებს (გნახვის შემთხვევაში).
limit_satsინტეგრიარდაახლოებით 1 წუთი წუთი წუთი წუთი წუთი წუთი წუთი წუთი წუთი
reset_periodStringარdaily, weekly ან monthlyსაჭიროება limit_satsდასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში
expire_atString ან IntegerარWhen the key stops working: ISO 8601 დრო, ან მლიზსკუდი 1970 წლიდან.

კონტაქტი (2012)

{
  "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"
  }
}
სტატუსიროდესაც
400არ არსებობს დიდი სახელი ან ძალიან ხანგრძლივი სახელი; უკვე გამოყენებული სახელი (duplicate_name); cap, რომელიც არ არის საერთო ნომერი მინიმუმ 1; reset დრო გარეშე cap; დასრულების წინასწარ; ცოდნა ფართობი (unknown_parameter); ან 25 აქტიური ღილაკები უკვე (too_many_keys).
429მეტი 60 ღილაკები ამ ნომერი, ან 120 ამ მისამართზე, ერთი საათის განმავლობაში (rate_limit_exceededერთად 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);

წაიკითხეთ ერთი Key

GET https://nymbot.ai/api/v1/keys/{id} დაარსდა

დაბრუნება {"data": {…}} ძირითადი მოწყობილობა, ან 404 key_not_found თუ არ არსებობს თქვენი კურსი ამ 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);

შეცვალოთ კურსი

PATCH https://nymbot.ai/api/v1/keys/{id} დაარსდა

გაგზავნა ნებისმიერი name, limit_sats, reset_period და expire_atიგივე წესები, როგორიცაა კლიენტების მიღება. null გაწმენდა ფართობი: არ არის cap, არ არის reset, არ არის დასრულება. გააუმჯობესების გაუმჯობესება გაუმჯობესება ახალი ფართობი იწყება 0-დან. გაუმჯობესებული key არ შეიძლება შეცვალოს (400 key_revoked) მოგზაურობა {"data": {…}} გაუმჯობესებული Key Object.

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

ღონისძიება Key

DELETE https://nymbot.ai/api/v1/keys/{id} დაარსდა

დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში revoked_at ჩართული და შეგიძლიათ იხილოთ include_revoked=trueდასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში.

პასუხი

{ "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 მოწყობილობები

Lightning Wallet- ის დაკავშირებით Nostr Wallet Connect და Nymbot- ს ს სავარაუდოდ შეესაბამება, როდესაც API- ის ღირებულება დაბალია. პროგრამის API- ის ფურცელი აქვს იგივე შეზღუდვები; ეს არის ეს Endpoints. ყველა მათთვის საჭიროა შეტყობინება.

როგორ მუშაობს: მას შემდეგ, რაც API მოთხოვნა დატვირთულია ბალანსი, რომელიც თქვენ აირჩიეთ, თუ ეს ბალანსი დატვირთულია თქვენი შეზღუდვის ქვემოთ, Nymbot აწარმოებს ბალანსი თქვენი top-up რაოდენობისთვის, მოითხოვს თქვენი ბალანსი გადაიხადოს, და დაამატებს საკრედიტო. ეს ბალანსი დატვირთულია ყოველ 5 წუთი ყოველდღიურად, ასე რომ მოთხოვნების ბალანსი არ შეუძლია ბალანსი გადაიხადოს. აპლიკაციებში გადაიხადვა არ აწარმოებს. ბოლო ბალანსი და ბოლო ბალანსი დრო და ზომა განახლებაა; თუ გადაიხადვა გააკეთა შეცდომის შემდეგ, შეამოწმეთ მისი ბალანსი Top-up სტატუსი დარეგისტრირეთ ეს

სანამ თქვენ დააყენებთ პლატფორმა

Nymbot შენახავს ეს ჩიპტირებული და მხოლოდ ერთხელ გამოიყენებს იგი გადაიხადოს საკუთარი top-up ანგარიშები, მაგრამ შექმნათ კავშირი მხოლოდ ამთვის, გაქვთ გადაიხადოს პროგნოზი თქვენი პანელი, ასე რომ ყველაზე მას შეუძლია გადაიხადოს არის ნომერი აირჩიეთ თქვენ. პანელი უნდა მხარს უჭერს pay_invoice.

კონფიგურაცია პაკეტზე

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect დაარსდა

ფართობიტიპიმოთხოვნააღწერა
nwc_urlStringდიახკონტაქტი, დაწყებული nostr+walletconnect://Nymbot მოითხოვს პლატფორმა get_info ადრე შენარჩუნება და შენარჩუნება კრეპტირებული.
threshold_satsინტეგრიდიახზემოთ, როდესაც ბალანსი ქვემოთ ამ ბევრი sats. მინიმუმ 1000.
topup_satsინტეგრიდიახრა უნდა გააკეთოთ ყოველდღიურად? 1000 to 1,000,000 sats.
tierStringარpro (სამთავრობო დასაწყისში) ან standard: ბალანსი, რომ შეამოწმოთ და top up.

პასუხი

{
  "data": {
    "connected": true,
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
    "last_topup_at": null,
    "last_topup_sats": null,
    "last_error": null
  }
}
სტატუსიროდესაც
400არ არის კონფიგურაცია (invalid_nwc_url); პლატფორმა არ პასუხისმგებლობა მისი რედაქტის შესახებ (nwc_unreachable) ან უარყოფითი კონფიგურაცია (nwc_rejected); კავშირი არ შეუძლია გადაიხადოს ანგარიშები (nwc_missing_permission) ან თანხა, რომელიც არ არის შეზღუდული.
501ავტომატური დატვირთვა არ არის გააქტიურებული ამ სერვერზე (nwc_unavailable) იგივე გამოიყენება სხვა ორი Endpoints.

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

წაიკითხეთ settings

GET https://nymbot.ai/api/v1/nwc-auto-topup დაარსდა

იმიტომ, რომ იგივე მოწყობილობა, რომელიც შეიცავს connected: false და სხვა სფეროებში null როდესაც არ არის კაბინეტი დაკავშირებული. კაბინეტი კაბინეტი თვითმართველობის არ იღებს.

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

კონტაქტი

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection დაარსდა

დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში დასაწყისში.

პასუხი

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

გადახდის მოთხოვნით, გარეშე კურსი

Fixed-price Endpoints შეიძლება გადაიხადოს ერთი მოთხოვნით ერთხელ Lightning, გარეშე key, არ ანგარიშის და არ ბალანსი: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations და POST /embeddingsჩატი, პასუხები და შეტყობინებები ყოველთვის სჭირდება Key. მოთხოვნა, რომელიც შეიცავს keyless არის გადაიხადოს, როგორც ჩვეულებრივ; გადახდის ფოსტის მხოლოდ დაიწყება, როდესაც არ არის გადაცემა keyless.

Nymbot ვთქვა ორი ვერსია იგივე იდეა, ერთი backend: Lightning Labs' 402 წლამდე (სავარაუდოდ, მისი ძველი სახელი, LSAT) და IETF პროექტი გადახდის HTTP- ის ავტომატური სერვისი lightning მეთოდები და charge გთხოვთ გამოიყენოთ, რაც თქვენი კლიენტს იცის.

თქვენი საკუთარი სერვერზე

გადახდის გარეშე კურსი არის მხოლოდ, როდესაც API_L402_SECRET შეიცავს მინიმუმ 32 ნომერი bytes, როგორიცაა hex (64 ნომერი) ან base64 (44). openssl rand -hex 32იმიტომ, რომ ეს არის ერთ-ერთი ყველაზე პოპულარული ფუნქციონირებული ფუნქციონირება. API_L402_SECRET_PREVIOUS ერთი დღის განმავლობაში: სტატისტიკა URLs, სტატისტიკა URLs და მოვლენები, რომლებიც გაკეთდა მას შემდეგ, რაც ისინი დასრულებენ.

Challenges

გამოქვეყნეთ მოთხოვნა No Authorization Header. თუ ეს არის რეალური, არაფერი არ მუშაობს, და თქვენ მიიღებთ 402 Payment Required დახურვის ფასი: იგივე ფასი, რომელიც კურსი გადაიხადოს, გადაიხადოს სტანდარტული კრედიტი ან 100 კრედიტი Pro კრედიტი და დახურულია მთლიანად მდე მდე მდე 1 კრედიტი და მინიმუმ 0.05 კრედიტი მინიმუმ). WWW-Authenticate მოთხოვნები იგივე ანგარიშზე:

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

გადახდის request პრაქტიკა base64url JSON: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

მოვლენები შეესაბამება შეესაბამება მოვლენები, მოვლენები Content-Type (სამდვილეში, მისი მედიის ტიპი და, მრავალფეროვანი, მისი გარიგება) და SHA-256-ზე, რომელიც გაგზავნა, დაახლოებით 15 წუთის განმავლობაში. გადახდის შემდეგ, გაგზავნა იგივე მოთხოვნა კიდევ ერთხელ: იგივე Content-Type და იგივე JSON bytes, ან მრავალფეროვანი Endpoints (/images/edits, /audio/transcriptions, /audio/translationsყველაზე HTTP ბიბლიოთეკები აირჩიონ ახალი ხაზს ყოველდღიურად, როდესაც ისინი კოდიფიცირებენ ფორმა, ასე რომ კოდიფიცირეთ იგი ერთხელ და გაგზავნეთ ეს ბეტის ორჯერ.

თითოეული მისამართი შეიძლება მოითხოვოს 30 მოვლენებს წუთში (IPv6 მისამართი წაიკითხა, როგორც მისი სრული /64). მოთხოვნები, whose address is not known share a stricter 10 წუთში, და არსებობს საერთო შეზღუდვა მოვლენებს Nymbot პრობლემები ყველა მისამართი; მოთხოვნები, რომელიც არ მოითხოვს, სანამ მოვლენები გაკეთება (გალითად, სხეულის, რომელიც არ არის valid JSON) არ მოითხოვს მას. 429 ერთად Retry-Afterფულადი Endpoints, რომელიც არ აქვს Key ან Credential, ასევე ითვლება საერთო შეზღუდვა 120 უტვირთული მოთხოვნები წუთი თითო მისამართი. Credential არის შეამოწმებული, სანამ Body ითვლება, და მოთხოვნები, რომელიც არ არის დატვირთული. Content-Type არ არის application/json (და multipart/form-data დასაწყისში დასაწყისში დასაწყისში დასაწყისში. 415 და არასდროს არ მიიღებს ანგარიშს.

Embeddings არის ფასი შედარებით tokens in input, ერთად 1.5 & times; margins, რადგან რეალური რაოდენობა ცნობილია მხოლოდ შემდეგ. თქვენ გადაიხადოს რეალურად გამოიყენებული tokens, და არ გამოიყენებული ნაწილი გადახდის დაბრუნება როგორც გადაიხადეთ token.

გადაცემა გადახდის

გადაიხადეთ ფულადი ნებისმიერი Lightning ფულადი. ფულადი გთავაზობთ წინასწარ სურათი, 64 ჰექსიმალური სიმბოლოები. შემდეგ გადაიხადეთ იგივე მოთხოვნა ერთი ამ:

პროგრამაHeader
402 წლამდეAuthorization: L402 <macaroon>:<preimage> (LSAT ასევე მუშაობს
გადახდისAuthorization: Payment <base64url JSON>სადაც JSON არის {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

გადაიხადული მოთხოვნა პასუხი იგივე, როგორიცაა მოთხოვნა, რომელიც გადაიხადული კურსი, გარდა ამისა, რომ nymbot Object არ აქვს ბალანსი ფართობი: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}და არ არის X-Nymbot-Balance-Sats Header. გადახდის მოთხოვნა გადახდის სისტემა ასევე მიიღებს a Payment-Receipt Header (base64url JSON with the challenge id, გადახდის hash as reference, status და timestampგადახდის მოთხოვნები არ არის დაკავშირებული ნებისმიერი nimm, ასე რომ ისინი არ გამოჩნდება კითხვის ისტორიაში.

სტატუსიროდესაც
402 payment_already_usedთითოეული გადახდის გადახდის ერთი მოთხოვნა. პასუხი არის ახალი მოთხოვნა ამ მოთხოვნა, ასე რომ კლიენტს, რომელიც cache მისი ბოლო კრედიტაცია (მაგ. lnget ეს არის) უბრალოდ დასაწყისში.
402 payment_mismatchდასაწყისში დასაწყისში დასაწყისში დასაწყისში, Content-Type ან სხეულის, ან გადაიხადოს ნაკლები, ვიდრე ეს მოთხოვნა ახლა ღირებულება. ახალი მოვლენები ამ მოთხოვნა მოდის მას; თუ გადახდის იყო ძალიან მცირე, ის, რაც თქვენ გადაიხადეთ დაბრუნება როგორც გადაიხადეთ token (refund_token და refund_sats და სხეულში )
402 payment_expiredუფრო მეტი, ვიდრე 15 წუთის განმავლობაში გამოწვევა. ახალი გამოწვევა მოდის მასთან ერთად. თუ წინასწარ სურათი აჩვენებს, რომ თქვენ გადაიხადეთ, ის, რაც თქვენ გადაიხადეთ, გადაიხადავს გადაიხადეთ token (refund_token და refund_sats ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ, ერთხელ.
401 invalid_preimagePreimage არ გაქირავებს ფულადი გადახდის გაქირავება. გადახდის არ გამოიყენება.
401 invalid_payment_credentialNymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ, ან Nymbot- ის გამოქვეყნების შემდეგ.
429 rate_limit_exceededMore than 30 credentials or keys which failed to verify came from this address in a minute, or one refund token was sent more than 60 times in a minute. 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"));

კლიენტები შექმნილია mppx Lightning მეთოდის გამოყენებით გადაიხადოს გადაიხადოს მოვლენები მათთვის; მიუთითეთ მათ Endpoint- ში და გაძლევთ გადაიხადოს.

ვიდეოები

გადახდის POST /videos პასუხი 202 როგორც კოლექცია, plus a status_url: GET ეს არის დარეგისტრირებული და მუშაობს 24 საათის განმავლობაში, სანამ მუშაობა გაგრძელდება.

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

შენარჩუნეთ refund_token მას შემდეგ, რაც ამ კითხვაზე არ არის შეტყობინება, ამ კითხვაზე არ არის შეტყობინება (GET /api/v1/l402/refunds პასუხი "status": "pending"); თუ render არ არის გადაიხადული, გადახდის იღებს მას. სტატისტიკა URL აჩვენებს refund_sats იმიტომ, რომ ამ კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის კლასის

გადახდის

If a paid request fails and the provider billed Nymbot for the attempt, გადახდის შენარჩუნება და შეცდომა ამბობს, რომ ეს არის. charged_satsროგორც წესი, ამ კითხვებს არ უნდა დააკმაყოფილოს. თუ ეს არ არის დააკმაყოფილოს, ამ კითხვებს არ უნდა დააკმაყოფილოს. გადაიხადეთ token რა ღირს თქვენ გადაიხადეთ:

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

არასამთავრობო ნაწილები დაბრუნება იგივე გზა: თუ თქვენ მოთხოვნა ორი სურათები და ერთი არ გააკეთა, წარმატების პასუხი nymbot მოვლენები შეიცავს გადახდის ტკიპედია დაკარგული ერთი; ტკიპედია, რომელიც სიგრძე არ შეიძლება წაიკითხოთ წინასწარ არის ფასი, როგორც ხანგრძლივი ფაილი შეიძლება იყოს (არ არ იყოს მეტი, ვიდრე 30 წუთი), და განსხვავება რეალური სიგრძე იღებს გადახდის ტკიპედია; თუ ის გამოჩნდა, რომ უფრო მეტია, ვიდრე 30 წუთი, იგი არ არის დაეხმარება. 413 და ყველა გადახდის დაბრუნება. შეფუთვა გადაიხადოს ის, რაც შეფასება გადაიხადოს. ცუდი ვიდეო გადაიხადოს მისი შეტყობინება გადაიხადოს.

Nymbot შეინახავს მხოლოდ მისი hash, და ის დასრულდება 30 დღის შემდეგ. მას შეინახავს sat ბალანსი, და თქვენ შეგიძლიათ:

  • გადაიხადეთ მას. გაგზავნა Authorization: Bearer REFUND-… ეს არის ერთ-ერთი უპირატესობა, რომ ეს არის ერთ-ერთი უპირატესობა, რომ ეს არის ერთ-ერთი უპირატესობა, რომ ეს არის ერთ-ერთი უპირატესობა (refund_token_sats In ამ nymbot სავარაუდოდ, ეს არ არის ის, რაც თქვენ უნდა გააკეთოთ. 402 refund_insufficient; არ დახურული ცუდი დააყენებს sats უკან იგივე token.
  • შეამოწმეთ GET /api/v1/l402/refunds იგივე Header Returns {"sats": 237, "status": "open", "expires_at": "..."}.
  • ერთი token შეიძლება გამოყენებულ იქნას მაქსიმალურად 60 წუთში.
  • დააყენეთ იგი NIM. დააყენეთ იგი გადაიხადეთ საჩუქარი Nymbot app- ში, ან ტელეფონით POST /api/v1/l402/refunds/redeem A შეტყობინება და {"refund_token": "REFUND-...", "balance": "standard"} (და "pro"სრული კრედიტები წავიდეთ ბალანსი (10 კრედიტი თითოეული სტანდარტული, 100 კრედიტი Pro); კრედიტი, რომელიც არ უზრუნველყოფს სრული კრედიტი ბალანსი 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"

პასუხი

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