বিষয়বস্তু এড়িয়ে যান
ফিরে আসুন Nymbot

জ্ঞানের ভিত্তি বিকাশকারী

ভারসাম্য, শীর্ষ ও চাবি

আপনার কাছে কী আছে তা পরীক্ষা করুন, লাইটনিং-এর উপর টপ আপ করুন, আপনার নিজের মানিব্যাগ থেকে স্বয়ংক্রিয়ভাবে টপ আপ করুন, প্রতিটি অনুরোধের দাম দেখুন এবং কোড থেকে কীগুলি পরিচালনা করুন।

ভারসাম্য পরীক্ষা

উভয় আপনার ভারসাম্য, এবং এই চাবি কত ব্যবহার করা হয়।

GET https://nymbot.ai/api/v1/credits/balance একটি API চাবি দরকার। 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"
  }
}
অবস্থানযখন
401চাবি অনুপস্থিত, অজানা, বাতিল বা মেয়াদ শেষ হয়েছে।

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

অর্থপ্রদানের পদ্ধতি

কিভাবে আপনি উপরে উঠতে পারেন, এবং সীমাবদ্ধতা. লাইট একমাত্র পদ্ধতি।

GET https://nymbot.ai/api/v1/topup/payment-methods চাবি লাগবে না।

একটি টপ-আপ 10 থেকে 1,000,000 sats; একটি প্রো টপ-আপ কমপক্ষে একটি প্রো ক্রেডিট কিনতে হবে, তাই এটি 100 sats থেকে শুরু করে। bulk_bonus বড় শীর্ষ-আপগুলিতে অতিরিক্ত ক্রেডিট তালিকাভুক্ত করে, অ্যাপ্লিকেশনের মতোই: 10%, 15% বা 20% স্ট্যান্ডার্ড শীর্ষ-আপগুলিতে 500, 1,000 বা 5,000 স্ট্যাট থেকে এবং 5,000, 10,000 বা 50,000 স্ট্যাট থেকে প্রো স্ট্যাট থেকে।

প্রতিক্রিয়া

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

লাইটের উপরে উঁচু

একটি লাইটিং ফ্যাক্টর তৈরি করে যা কীগুলির মালিকানাধীন নিমের জন্য ক্রেডিট যোগ করে। চেক করুন ক্রেডিট যোগ করা।

POST https://nymbot.ai/api/v1/topup/create/btc-lightning একটি API চাবি দরকার।

মাঠপ্রকারপ্রয়োজন।বর্ণনা
amountসংখ্যাহ্যাঁকতটা, কতটা currency. স্যাটসের জন্য একটি সম্পূর্ণ সংখ্যা।
currencyস্ট্রিংনাSATS (পরের সংবাদ) দুর্বলতা USD অথবা BTCডলার বর্তমান বিটকয়েন মূল্যে রূপান্তরিত হয়।
tierস্ট্রিংনাpro (ডিফল্ট) অথবা standard: যা ক্রেডিট ব্যালেন্স যায়।

একটি স্ট্যান্ডার্ড ক্রেডিট 10 sats এবং একটি প্রো ক্রেডিট 100 sats, প্লাস কোনও মোট বোনাস; 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১০০০ টাকায় (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
}
অবস্থানযখন
400আইডিটি তৈরি কল থেকে 64 চরিত্রের আইডি নয়।
404তুমি তোমার রবের নিকট কুরবানী করো না।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 কী প্রয়োজন, যা তার নিজস্ব অনুরোধগুলি দেখে, অথবা একটি আবেদনের স্বাক্ষর আপনার এনআইএম থেকে, যা প্রতিটি চাবি দেখে।

মাঠপ্রকারপ্রয়োজন।বর্ণনা
pageপূর্ণসংখ্যা (অনুসন্ধান)নাডিফল্ট 1, সর্বোচ্চ 1,000; একটি উচ্চ পৃষ্ঠা 400 invalid_value.
page_countপূর্ণসংখ্যা (অনুসন্ধান)নাপ্রতি পৃষ্ঠায় সারি। ডিফল্ট 20, সর্বাধিক 100।
start_date
end_date
স্ট্রিং (অনুসন্ধান)নাISO 8601 তারিখ বা সময়।
modelস্ট্রিং (অনুসন্ধান)নাশুধু এই মডেল।
typeস্ট্রিং (অনুসন্ধান)নাchat, responses, messages, image, video, speech, transcription অথবা embedding.
all_keysবাঙালি (Query)নাএকটি চাবি সহঃ true একই নামের প্রতিটি কী অন্তর্ভুক্ত করে। ডিফল্ট false.
key_idস্ট্রিং (অনুসন্ধান)নাস্বাক্ষরিত অনুরোধ সহ, অথবা 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);

অ্যাকাউন্টের অনুরোধ

চাবি তৈরি, পরিবর্তন এবং বাতিল, অ্যাকাউন্ট সারসংক্ষেপ এবং স্বয়ংক্রিয় শীর্ষ-আপ একটি API চাবি গ্রহণ করে না. তারা আপনার nym থেকে একটি স্বাক্ষর গ্রহণ করে, তাই একটি লুকানো চাবি তার ক্যাপ পর্যন্ত ব্যয় করতে পারে কিন্তু কখনো অন্য চাবি তৈরি করতে পারে না বা তার নিজস্ব ক্যাপ বাড়াতে পারে।

অ্যাপটি আপনার জন্য এটি করেঃ এর মধ্যে সবকিছু আগুন আপনি শুধুমাত্র আপনার নিজের কোড থেকে কীগুলি পরিচালনা করতে এই বিভাগের প্রয়োজন।

স্বাক্ষরটি 27235 (এনআইপি-98) ধরনের একটি নোস্টার ইভেন্ট, যা বেস64-এনকোডে পাঠানো হয়েছে Authorization শব্দের সঙ্গে হেডার Nostr সামনেঃ

ইভেন্ট

{
  "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, অনুসন্ধান শাখা অন্তর্ভুক্ত, ঠিক যেমন পাঠানো হয়েছে।
  • method এটি HTTP পদ্ধতি।
  • payload SHA-256 হল কাঁচা অনুরোধের শরীরের SHA-256। POST এবং PATCH, এবং আপনি যে দেহটি পাঠাবেন তা অবশ্যই আপনার হ্যাশ করা বাইটের জন্য বাইটে হতে হবে।
  • created_at সার্ভারের ঘড়ির 60 সেকেন্ডের মধ্যে থাকতে হবে।
  • প্রতিটি ঘটনা একবার কাজ করে, একটি GET অন্তর্ভুক্ত, তাই একটি ক্যাপচার হেডার পুনরায় প্লে করা যাবে না. প্রতিটি অনুরোধের জন্য একটি নতুন স্বাক্ষর করুন. nonce একটি র্যান্ডম মান দিয়ে ট্যাগ করুন যাতে একই সেকেন্ডে স্বাক্ষরিত দুটি অনুরোধ এখনও আলাদা থাকে।
  • একটি স্বাক্ষরিত অনুরোধের শরীর সর্বোচ্চ 64 KB হতে পারে, এবং শরীরের প্রয়োজন Content-Type: application/json.

একটি অনুপস্থিত ইভেন্ট ফিরে আসে 401 missing_nostr_authএকটি যা খারাপভাবে গঠিত, খারাপভাবে স্বাক্ষরিত, খুব পুরানো, বা একটি ভিন্ন ইউআরএল, পদ্ধতি বা বডি রিটার্নের জন্য invalid_nostr_auth, বার্তার কারণ সহ; একটি পুনঃব্যবহৃত ফিরে আসে nostr_auth_replayedএই চূড়ান্ত পয়েন্টে পাঠানো একটি API কী প্রত্যাখ্যান করা হয়. স্বাক্ষরটি শরীরটি পড়ার আগে চেক করা হয়, এবং প্রতিটি ঠিকানা প্রতি মিনিটে 30 বার এটি ব্যর্থ করতে পারে (একটি IPv6 ঠিকানা /64 হিসাবে হিসাবে গণনা করা হয়); তারপর এটি পাবেন 429 সঙ্গে Retry-After.

ব্রাউজাররা কেবল নিম্বটের নিজস্ব সাইটগুলি থেকে এই শেষ পয়েন্টগুলিতে কল করতে পারে (https://nymbot.ai, https://nymchat.app অন্য কোনও সাইটে একটি পৃষ্ঠা কোনও CORS শিরোনাম ফিরে পাবে না, তাই সে যা ফিরে পাবে তা পড়তে পারে না। Originতারা প্রভাবিত হয় না।

আপনার গোপন চাবি

স্বাক্ষর করার জন্য আপনার এনআইএম-এর গোপন চাবি প্রয়োজন ( nsec) যা সবকিছু নিয়ন্ত্রণ করে: আপনার পরিচয়, আপনার ইতিহাস এবং আপনার ভারসাম্য. শুধুমাত্র আপনি বিশ্বাসযোগ্য মেশিনে একটি স্ক্রিপ্টে এটি রাখুন, এটি ফাইলে লিখার পরিবর্তে এটি পরিবেশ থেকে পড়ুন, এবং যখন আপনি পারেন তখন অ্যাপ্লিকেশনটি পছন্দ করুন।

এই সাহায্যকারীগুলি শিরোনাম তৈরি করে। এই পৃষ্ঠার পরবর্তী উদাহরণগুলি তাদের ব্যবহার করে। NOSTR_SECRET_HEXসি. ইউ. আর. এল ব্যবহার করে নাক কমান্ড লাইন টুল, যা একটি nsec বা hex কী গ্রহণ করে, এবং sha256sum (ম্যাকোস-এ, 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");
}

অ্যাকাউন্ট সংক্ষিপ্ত

অ্যাপ্লিকেশনের এপিআই শীর্ষে কী দেখায়: আপনার পাবলিক কী, উভয় ভারসাম্য, কতগুলি কী সক্রিয় (উপস্থিত বা বাতিল করা হয়নি), এবং স্বয়ংক্রিয় টপ-আপ সেটিংস, বা null যখন সার্ভার তাদের অফার করে না।

GET https://nymbot.ai/api/v1/account দরকার একটি আবেদনের স্বাক্ষর.

প্রতিক্রিয়া

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

চাবি ব্যবস্থাপনা

অ্যাপ্লিকেশনের চাবি তালিকার পেছনে শেষ পয়েন্টগুলি। আবেদনের স্বাক্ষরপ্রতিটি চাবি এই ফর্মটিতে ফেরত দেওয়া হয়, যার মধ্যে ISO 8601 এর সময় এবং sats এর পরিমাণ রয়েছে:

মূল বস্তু

{
  "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 একটি চাবি শনাক্ত করার জন্য যথেষ্ট কিন্তু এটি ব্যবহার করার জন্য নয়। চাবি নিজেই শুধুমাত্র একবার ফেরত দেওয়া হয়, যখন এটি তৈরি করা হয়।

চাবি তালিকা

GET https://nymbot.ai/api/v1/keys স্বাক্ষর

মাঠপ্রকারপ্রয়োজন।বর্ণনা
include_revokedবাঙালি (Query)নাপাসওয়ার্ড অন্তর্ভুক্ত করুন. 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);

একটি চাবি তৈরি করুন

POST https://nymbot.ai/api/v1/keys স্বাক্ষর, ফেরত যান 201.

মাঠপ্রকারপ্রয়োজন।বর্ণনা
nameস্ট্রিংহ্যাঁ1 থেকে 40 চরিত্র, আপনার অন্যান্য সক্রিয় চাবি থেকে আলাদা (অনুসন্দেহের ক্ষেত্রে)।
limit_satsঅন্তর্ভুক্তনাব্যয়ের সীমা কমপক্ষে 1. কোনও সীমা ছাড়াই রেখে দিন।
reset_periodস্ট্রিংনাdaily, weekly অথবা monthlyপ্রয়োজনীয়তা limit_satsএটি এমন একটি টুপির জন্য রেখে দিন যা কখনই পুনরায় সেট হয় না।
expire_atস্ট্রিং বা পূর্ণসংখ্যানাযখন কী কাজ বন্ধ করে: একটি ISO 8601 সময়, অথবা 1970 সাল থেকে মিলিসেকেন্ড।

প্রতিক্রিয়া (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"
  }
}
অবস্থানযখন
400একটি অদৃশ্য বা খুব দীর্ঘ নাম; একটি ইতিমধ্যে ব্যবহার করা নাম (duplicate_name); একটি ক্যাপ যা অন্তত 1 এর একটি সম্পূর্ণ সংখ্যা নয়; কোনও ক্যাপ ছাড়াই একটি রিসেট সময়; একটি অতীতের মেয়াদ; একটি অজানা ক্ষেত্র (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);

একটি চাবি পড়া

GET https://nymbot.ai/api/v1/keys/{id} স্বাক্ষর

ফেরত {"data": {…}} মূল বস্তুর সাথে, অথবা 404 key_not_found যদি আপনার কোন চাবি এই আইডি নেই।

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 পৃথিবীর সবচেয়ে গুরুত্বপূর্ণ জায়গাগুলোর মধ্যে একটি হচ্ছে, যেখানে কোনও জায়গা নেই, কোনও জায়গা নেই, কোনও জায়গা নেই, কোনও জায়গা নেই।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);

একটি চাবি বাতিল

DELETE https://nymbot.ai/api/v1/keys/{id} স্বাক্ষর

চাবিটি একবারে বন্ধ করে দেয়, ভালোর জন্য। এটি তালিকার মধ্যে থেকে যায় revoked_at সাজানো হয়েছে, দেখতে পাওয়া যাবে include_revoked=true. ইতিমধ্যে বাতিল করা একটি চাবি বাতিল করা একইভাবে উত্তর দেয়. শুধুমাত্র সর্বশেষ 50 বাতিল করা চাবি সংরক্ষণ করা হয়; পুরাতন চাবি বাতিল করা হয় যখন অন্য চাবি বাতিল করা হয়.

প্রতিক্রিয়া

{ "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 অটো-টপ-আপ

একটি লাইটনিং ওয়ালেটকে নস্টার ওয়ালেট কানেক্ট দিয়ে সংযুক্ত করুন এবং যখন এপিআই খরচ কম হয় তখন নিম্বট নিজেই ভারসাম্য বজায় রাখে। অ্যাপের এপিআই শীটে একই সেটিংস রয়েছে; এগুলি এর পিছনের শেষ পয়েন্ট। তাদের সকলেরই একটি ভারসাম্য প্রয়োজন। আবেদনের স্বাক্ষর.

এটি কিভাবে কাজ করে: একটি এপিআই অনুরোধটি আপনি দেখার জন্য বেছে নেওয়া ব্যালেন্সে চার্জ করার পরে, যদি সেই ব্যালেন্স আপনার সীমার নিচে পড়ে, Nymbot আপনার শীর্ষ-আপ পরিমাণ জন্য একটি ফ্যাক্টর তৈরি করে, আপনার পকেটকে এটি পরিশোধ করার জন্য জিজ্ঞাসা করে এবং ক্রেডিট যোগ করে। এটি প্রতি 5 মিনিটে সর্বোচ্চ একবার প্রতিটি নিম এবং ভারসাম্য জন্য শীর্ষ, তাই অনুরোধের একটি বিস্ফোরণ পকেটটি ড্রপ করতে পারে না। অ্যাপ্লিকেশনগুলিতে ব্যয় এটি চালু করে না। সর্বশেষ শীর্ষ-আপের সময় এবং আকার, এবং শেষ ত্রুটি, সেটিংসে রয়েছে; যদি একটি পেমেন্ট একটি ত্রুটি পরে গিয়েছিল, তার ফ্যাক্ট শীর্ষস্থানীয় অবস্থা এর কৃতিত্ব দিন।

একটি পকেট সংযুক্ত করার আগে

Nymbot এটি এনক্রিপ্ট করে সংরক্ষণ করে এবং শুধুমাত্র তার নিজস্ব টপ-আপ ফ্যাক্টরগুলি পরিশোধ করার জন্য এটি ব্যবহার করে, কিন্তু এই জন্য একটি সংযোগ তৈরি করুন, আপনার পকেটে একটি ব্যয় বাজেটের সাথে, যাতে সবচেয়ে বেশি এটি কখনও পরিশোধ করতে পারে একটি সংখ্যা আপনি বেছে নেয়। pay_invoice.

একটি পকেট সংযোগ

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect স্বাক্ষর

মাঠপ্রকারপ্রয়োজন।বর্ণনা
nwc_urlস্ট্রিংহ্যাঁলিঙ্ক সংযোগ, শুরু nostr+walletconnect://Nymbot পকেটের জন্য জিজ্ঞাসা get_info এর আগে তা সংরক্ষণ করা হবে এবং সেটি লুকিয়ে রাখা হবে।
threshold_satsঅন্তর্ভুক্তহ্যাঁঅর্থাৎ, যখন এই সংখ্যাগুলি কমে যায়, তখন অন্তত ১,০০০।
topup_satsঅন্তর্ভুক্তহ্যাঁপ্রতিবার কত যোগ করতে হবে। 1,000 থেকে 1,000,000 স্যাটস।
tierস্ট্রিংনাpro (ডিফল্ট) অথবা standard: দেখার এবং টপ আপ করার ভারসাম্য।

প্রতিক্রিয়া

{
  "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) অন্য দুটি চূড়ান্ত পয়েন্টের ক্ষেত্রেও এটি প্রযোজ্য।

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

সেটিংস পড়া

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

চাবি ছাড়া অনুরোধে অর্থ প্রদান

স্থিতিশীল মূল্য এন্ডপয়েন্টগুলি একবারের জন্য একটি অনুরোধের জন্য Lightning এর মাধ্যমে পরিশোধ করা যেতে পারে, কোন চাবি, কোন অ্যাকাউন্ট এবং কোন ভারসাম্য ছাড়া: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations এবং POST /embeddingsচ্যাট, উত্তর এবং বার্তা সবসময় একটি চাবি প্রয়োজন. একটি চাবি বহনকারী একটি অনুরোধ স্বাভাবিক হিসাবে বাকি হিসাবে চার্জ করা হয়; পেমেন্ট প্রবাহ শুধুমাত্র শুরু হয় যখন কোন চাবি পাঠানো হয় না।

Nymbot একই ধারণার দুটি সংস্করণ বলছে, একই ব্যাকেন্ড থেকে: Lightning Labs' এল402 (এর পুরোনো নামেও গৃহীত, LSAT) এবং IETF প্রকল্প পরিশোধ HTTP Authentication পদ্ধতি lightning পদ্ধতি এবং charge আপনার গ্রাহক যা বোঝেন তা ব্যবহার করুন।

নিজের সার্ভার চালাচ্ছেন

চাবি ছাড়া অর্থ প্রদান তখনই চালু থাকে যখন API_L402_SECRET অন্তত 32 বাইট অন্তর্ভুক্ত, হেক্স (64 চরিত্র) বা base64 (44) হিসাবে। openssl rand -hex 32একটি ছোট বা অনুমানযোগ্য মান বৈশিষ্ট্যটি বন্ধ করে দেয় এবং লগ করে দেয় কেন। এটি ঘোরানোর জন্য, পুরানো মানটি সরান API_L402_SECRET_PREVIOUS একদিনের জন্যঃ শংসাপত্র, স্ট্যাটাস ইউআরএল এবং এর অধীনে তৈরি চ্যালেঞ্জগুলি তাদের মেয়াদ শেষ না হওয়া পর্যন্ত কাজ করে।

চ্যালেঞ্জ

অনুরোধটি না দিয়ে পাঠান Authorization হেডার. যদি এটি বৈধ হয়, তাহলে কিছুই চলবে না, এবং আপনি 402 Payment Required সেই অনুরোধের জন্য ঠিক কী খরচ হবে তার জন্য একটি চালান সহঃ একটি কী একই মূল্য দেবে, 10 স্যাট স্ট্যান্ডার্ড ক্রেডিট বা 100 স্যাট প্রো ক্রেডিট রূপান্তরিত হবে এবং পুরো স্যাট পর্যন্ত পূর্ণ হবে (কমপক্ষে 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 বাইট, অথবা একাধিক অংশ অন্তর্নিহিত (/images/edits, /audio/transcriptions, /audio/translationsবেশিরভাগ HTTP লাইব্রেরিগুলি প্রতিটি ফর্মকে কোড করার সময় একটি নতুন সীমা নির্বাচন করে, তাই এটি একবার কোড করুন এবং সেই বাইটগুলি দুবার পাঠান।

প্রতিটি ঠিকানা প্রতি মিনিটে 30 টি চ্যালেঞ্জের জন্য জিজ্ঞাসা করতে পারে (একটি IPv6 ঠিকানা তার সম্পূর্ণ /64 হিসাবে গণনা করে)। 429 সঙ্গে Retry-After, বডি পড়ার আগে পাঠানো হয়। একটি কী বা শংসাপত্র ছাড়াই কল করা প্রদত্ত শেষ পয়েন্টগুলিও প্রতি ঠিকানায় এক মিনিটে 120 টি অননুমোদিত অনুরোধের সাধারণ সীমার দিকে গণনা করা হয়। বডি পড়ার আগে একটি শংসাপত্র পরীক্ষা করা হয়, এবং একটি অনুরোধ যার Content-Type নয় application/json (অথবা multipart/form-data প্রত্যাখ্যান করা হয়েছে। 415 কখনোই অ্যাকাউন্ট পাবেন না।

এমবেডিংগুলি ইনপুটের টোকেনগুলির একটি অনুমান থেকে মূল্যায়ন করা হয়, 1.5× মার্জিনের সাথে, কারণ বাস্তব সংখ্যাটি কেবল পরে জানা যায়। টোকেন ফেরত.

অর্থ প্রদান পাঠানো হচ্ছে

কোনও লাইটিং পকেটের সাথে ফ্যাক্টরটি পরিশোধ করুন. পকেটটি আপনাকে 64 হেক্স চিহ্ন, প্রাক ইমেজ দেয়. তারপর একই অনুরোধটি একইভাবে পাঠান:

পরিকল্পনাহেডার
এল402Authorization: L402 <macaroon>:<preimage> (LSAT কাজও করতেন)
পরিশোধAuthorization: Payment <base64url JSON>যেখানে JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

একটি প্রদত্ত অনুরোধ ঠিক একটি চাবি সঙ্গে করা একইভাবে উত্তর দেয়, ব্যতীত যে nymbot বস্তুর কোনও ভারসাম্য ক্ষেত্র নেইঃ {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}এবং নেই কোন X-Nymbot-Balance-Sats হেডার. একটি পেমেন্ট সিস্টেমের সাথে অর্থ প্রদানের অনুরোধটিও একটি Payment-Receipt হেডার (চ্যালেঞ্জ আইডি সহ বেস64ইউআরএল জে. এস. ও. এন, পেমেন্ট হ্যাশ হিসাবে reference, status এবং timestamp) পেমেন্ট অনুরোধগুলি কোন নিমের সাথে সংযুক্ত হয় না, তাই তারা অনুসন্ধানের ইতিহাসে প্রদর্শিত হয় না।

অবস্থানযখন
402 payment_already_usedপ্রতিটি পেমেন্ট একটি অনুরোধের জন্য প্রদান করে. উত্তরটি এই অনুরোধের জন্য একটি নতুন চ্যালেঞ্জ, তাই একটি ক্লায়েন্ট যা তার শেষ ক্রেডিটেশন ক্যাশ করে (যেমন lnget শুধু আবার দেশে ফিরে আসে।
402 payment_mismatchআরেকটি চূড়ান্ত চূড়ান্ত চূড়ান্ত চূড়ান্ত চূড়ান্ত চূড়ান্ত চূড়ান্ত চূড়ান্ত Content-Type বা বডি, বা এই অনুরোধের চেয়ে কম অর্থ প্রদান করার জন্য এখন খরচ হয়। এই অনুরোধের জন্য একটি নতুন চ্যালেঞ্জ আসে; যদি অর্থ প্রদান খুব কম হয়, তাহলে আপনি যা প্রদান করেছেন তা ফেরত আসে। টোকেন ফেরত (refund_token এবং refund_sats শরীরে )
402 payment_expiredচ্যালেঞ্জটির 15 মিনিটেরও বেশি সময় কেটে গেছে। এর সঙ্গে একটি নতুন চ্যালেঞ্জ আসে। যদি প্রিমেজ দেখায় যে আপনি অর্থ প্রদান করেছেন, তাহলে আপনি যা প্রদান করেছেন তা ফেরত আসে। টোকেন ফেরত (refund_token এবং refund_sats এরপর একবার, একবার, একবার, একবার, একবার, একবার, একবার, একবার, একবার, একবার, একবার।
401 invalid_preimageপ্রিমেজ ইনভয়েসের পেমেন্ট হ্যাশে হ্যাশ করে না। পেমেন্ট ব্যবহার করা হয় না।
401 invalid_payment_credentialক্রেডিটেশনটি ভুলফর্ম করা হয়, Nymbot এর পরে পরিবর্তন করা হয়েছে, অথবা একটি পেমেন্ট হ্যাশ নাম Nymbot এর জন্য কখনো ফ্যাক্টর প্রদান করেনি. একটি ম্যাকারন যা একটি সতর্কতা Nymbot জানে না, অথবা বিরোধী সতর্কতা সঙ্গে, অস্বীকার করা হয়.
429 rate_limit_exceeded30 টিরও বেশি সনাক্তকরণ বা চাবি যা নিশ্চিত করতে ব্যর্থ হয়েছে এক মিনিটে এই ঠিকানা থেকে এসেছে, অথবা এক মিনিটে 60 টিরও বেশি বার একটি ফেরত টোকেন পাঠানো হয়েছিল। 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 একটি লাইটনিং পদ্ধতি দিয়ে পেমেন্ট চ্যালেঞ্জটি নিজেরাই পরিচালনা করুন; তাদের শেষ বিন্দুতে নির্দেশ করুন এবং তাদের অর্থ প্রদান করতে দিন।

ভিডিও

একটি প্রদত্ত POST /videos উত্তর 202 যেমন একটি চাবিকাঠি, প্লাস একটি 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"); যদি রেন্ডার অপসারণ ব্যর্থ হয়, তাহলে পেমেন্ট তার উপর অবতরণ করে। refund_sats একটি ফেরত চাকরি জন্য কিন্তু কখনো টোকেন, তাই স্ট্যাটাস ইউআরএল ভাগ করা ফেরত ভাগ করা হয় না. টোকেন চেক করা একটি ব্যর্থ চাকরিও সমাধান করে যা কেউ জরিপ করা হয়নি।

ফেরত

যদি একটি প্রদত্ত অনুরোধ ব্যর্থ হয় এবং সরবরাহকারী চেষ্টার জন্য Nymbot চার্জ করেছে, তাহলে অর্থ সংরক্ষণ করা হয় এবং ত্রুটি এটি বলে, charged_satsএক্ষেত্রে, যদি এটি ব্যর্থ হয়, তাহলে ত্রুটি একটি চাবিকাঠি নিয়ে যায়। টোকেন ফেরত আপনি যা প্রদান করেছেন তার মূল্যঃ

{
  "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 Object একটি রিফান্ড টোকেন বহন করে যা অনুপস্থিত হয়; একটি ট্রান্সপ্লিপশন যার দৈর্ঘ্য প্রথমে পড়তে পারে না যা ফাইলটি 30 মিনিটের বেশি হতে পারে না (কখনও 30 মিনিটের বেশি না), এবং প্রকৃত দৈর্ঘ্যের পার্থক্যটি একটি রিফান্ড টোকেন হিসাবে ফিরে আসে; যদি এটি 30 মিনিটের বেশি হয় তবে এটি অস্বীকার করা হয় 413 এবং পুরো পেমেন্ট ফেরত আসে. ইনব্যাডিংস যা মূল্যায়ন ধরে রেখেছিল তা ফেরত দেয়. একটি ব্যর্থ ভিডিও তার প্রেরিত টোকেন ফেরত দেয়।

একটি ফেরত টোকেন একটি র্যান্ডম 256-বিট কোড। Nymbot শুধুমাত্র তার হ্যাশ সংরক্ষণ করে, এবং এটি 30 দিনের পরে শেষ হয়।

  • এটা দিয়ে টাকা দিন। পাঠান Authorization: Bearer REFUND-… অর্থাৎ, যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে যেকোনো জিনিসের জন্যে।refund_token_sats এর মধ্যে nymbot একটি টোকেন অনুরোধের জবাবের চেয়ে কম মূল্য 402 refund_insufficientএকটি ব্যর্থতা একই টোকেনের উপর sats ফিরিয়ে দেয়।
  • এটি চেক করুন। GET /api/v1/l402/refunds একই হেডার রিটার্ন সহ {"sats": 237, "status": "open", "expires_at": "..."}.
  • এক মিনিটে সর্বোচ্চ ৬০ বার টোকেন ব্যবহার করা যাবে।
  • এক নম্বরে এগিয়ে যান। এতে পেস্ট করুন উপহার পুনরুদ্ধার Nymbot অ্যাপ্লিকেশন, অথবা কল POST /api/v1/l402/refunds/redeem A সঙ্গে আবেদনের স্বাক্ষর এবং {"refund_token": "REFUND-...", "balance": "standard"} (অথবা "pro"সম্পূর্ণ ক্রেডিটগুলি বালুতে যায় (10 স্ট্যান্ডার্ডে প্রতিটি sats, 100 প্রো); API অনুরোধগুলির জন্য টোকেনে একটি সম্পূর্ণ ক্রেডিট থাকার জন্য sats যা তৈরি করে না।

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