বিষয়বস্তুলৈ যাওক
নিম্বটলৈ ঘূৰি যাওক

জ্ঞানৰ ভিত্তি ডেভেলপাৰ্ছবৃন্দ

ব্যালেন্স, টপ-আপ আৰু কী (keys)

আপোনাৰ ওচৰত কি আছে পৰীক্ষা কৰক, Lightning ৰ জৰিয়তে টপ-আপ কৰক, আপোনাৰ নিজৰ ৱালেটৰ পৰা স্বয়ংক্ৰিয়ভাৱে টপ-আপ কৰক, প্ৰতিটো ৰিকোৱেষ্টৰ খৰচ কিমান সেয়া চাওক, আৰু ক'ডৰ পৰা কী (keys) পৰিচালনা কৰক।

ভাৰসাম্য পৰীক্ষা কৰা হৈছে

আপোনাৰ দুয়োটা ভাৰসাম্য, আৰু এই চাবিৰ কেপৰ কিমানখিনি ব্যৱহাৰ কৰা হয়।

GET https://nymbot.ai/api/v1/credits/balance - এটা এ. পি. আই. চাবিৰ প্ৰয়োজন। 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 ছেট; এজন প্ৰ" টপ-আপে কমেও এটা প্ৰ "ক্ৰেডিট কিনিব লাগিব, সেয়েহে ই 100 ছেটত আৰম্ভ হয়। ডলাৰৰ সীমাটোৱে বিটকোইনৰ মূল্য অনুসৰণ কৰে। bulk_bonus ডাঙৰ টপ-আপসমূহত অতিৰিক্ত ক্ৰেডিট তালিকাভুক্ত কৰে, এপটোৰ দৰেইঃ 500,1,000 বা 5,000 চেটৰ পৰা ষ্টেণ্ডাৰ্ড টপ-আপত 10 শতাংশ, 15 শতাংশ বা 20 শতাংশ অধিক, আৰু 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);

Lightning ৰ জৰিয়তে টপ-আপ কৰা

এটা লাইটনিং চালান তৈয়াৰ কৰে যিয়ে চাবিটোৰ অন্তৰ্গত নামটোত ক্ৰেডিট যোগ কৰে। যিকোনো লাইটনিং ৱালেটৰ পৰা ইয়াক পৰিশোধ কৰক, তাৰ পিছত jeka kora ক্ৰেডিট যোগ কৰিবলৈ।

POST https://nymbot.ai/api/v1/topup/create/btc-lightning - এটা এ. পি. আই. চাবিৰ প্ৰয়োজন।

ক্ষেত্ৰখনধৰণপ্ৰয়োজনীয়বৰ্ণনা
amountসংখ্যাহয়কিমান, ভিতৰত currency. sats ৰ বাবে এটা পূৰ্ণ সংখ্যা।
currencyশাৰীনাই।SATS (অবিকল্পিত), USD বা BTCডলাৰসমূহ বৰ্তমানৰ বিটকোইন মূল্যত ৰূপান্তৰিত কৰা হয়।
tierশাৰীনাই।pro (অবিকল্পিত) বা standard: যি ঋণৰ ভাৰসাম্যলৈ যায়।

এটা মানক ক্ৰেডিট হ "ল 10 চেট আৰু এটা প্ৰ" ক্ৰেডিট 100 চেট, লগতে যিকোনো বাল্ক বোনাছ। 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,000,000 ছেট (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);

টপ-আপ পৰীক্ষা কৰি থকা

ইনভয়েচটো পৰিশোধ কৰা হৈছে নে নাই সুধিব পাৰে আৰু পৰিশোধ কৰাৰ পিছত, ক্ৰেডিটটো যোগ কৰিব। পৰীক্ষা কৰা হ'ব যে ই কিদৰে ক্ৰেডিট কৰে, গতিকে পৰিশোধ কৰাৰ পিছত, স্থিতিটো পৰ্যন্ত পৰীক্ষা কৰি থাকক 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এইটো 'create call' ৰ পৰা পোৱা ৬৪-অংকৰ ID টো নহয়।
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 - এটা এ. পি. আই. চাবিৰ প্ৰয়োজন, যি নিজৰ অনুৰোধসমূহ দেখে, বা এটা স্বাক্ষৰ কৰা অনুৰোধ আপোনাৰ এনআইএমৰ পৰা, যি প্ৰতিটো চাবি দেখে।

ক্ষেত্ৰখনধৰণপ্ৰয়োজনীয়বৰ্ণনা
pageপূৰ্ণসংখ্যা (অনুসন্ধান)নাই।ডিফল্ট 1, সৰ্বাধিক 1,000; এটা উচ্চ পৃষ্ঠা হ'ল 400 invalid_value.
page_countপূৰ্ণসংখ্যা (অনুসন্ধান)নাই।প্ৰতি পৃষ্ঠা এটাত শাৰী। ডিফল্ট ২০, সৰ্বাধিক ১০০।
start_date
end_date
স্ট্ৰিং (কুৱেৰী)নাই।আই. এছ. অ '. 8601 তাৰিখ বা সময়।
modelস্ট্ৰিং (কুৱেৰী)নাই।কেৱল এই মডেলটো।
typeস্ট্ৰিং (কুৱেৰী)নাই।chat, responses, messages, image, video, speech, transcription বা embedding.
all_keysবুলিয়ান (অনুসন্ধান)নাই।এটা চাবিৰ সৈতেঃ true একেই nym-ৰ প্ৰতিটো কী অন্তৰ্ভুক্ত কৰে। ডিফল্ট 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);

একাউণ্টৰ অনুৰোধত স্বাক্ষৰ কৰা হৈছে

চাবি তৈয়াৰ কৰা, সলনি কৰা আৰু প্ৰত্যাহাৰ কৰা, একাউণ্টৰ সাৰাংশ আৰু স্বয়ংক্ৰিয় টপ-আপবোৰে এটা এপিআই চাবি নলয়। তেওঁলোকে আপোনাৰ এনআইএমৰ পৰা এখন স্বাক্ষৰ লয়, যাতে এটা লিক হোৱা চাবি ইয়াৰ কেপলৈকে ব্যয় কৰিব পাৰে কিন্তু কেতিয়াও আন চাবি বনাব নোৱাৰে বা নিজৰ কেপ বৃদ্ধি কৰিব নোৱাৰে।

এপটোৱে আপোনাৰ বাবে এইটো কৰেঃ ইয়াৰ ভিতৰত থকা সকলো এ. পি. আই. শ্বীটত এই অন্তিম বিন্দুবোৰ ব্যৱহাৰ কৰা হয়। আপোনাৰ নিজৰ ক'ডৰ পৰা চাবি ব্যৱস্থাপনা কৰিবলৈ আপোনাক কেৱল এই অংশটোৰ প্ৰয়োজন।

স্বাক্ষৰটো হৈছে 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 ই হৈছে এইচ. টি. টি. পি. পদ্ধতি।
  • payload raw request body-ৰ SHA-256, hex ৰূপত। ইৰ প্ৰয়োজন হয় POST আৰু PATCH, আৰু আপুনি পঠোৱা বডিটোৱে আপুনি হেছ কৰা বডিটোৰ দৰে বায়্ট অনুসৰি হুবহু হ'ব লাগিব।
  • created_at চাৰ্ভাৰৰ ঘড়ীৰ 60 ছেকেণ্ডৰ ভিতৰত থাকিব লাগিব।
  • প্ৰতিটো ইভেন্টে এবাৰকৈ কাম কৰে, এ GET অন্তৰ্ভুক্ত কৰা হৈছে, গতিকে বন্দী কৰা হেডাৰটো পুনৰ চলাব নোৱাৰি। প্ৰতিটো অনুৰোধৰ বাবে এটা নতুন স্বাক্ষৰ কৰক। এটা যোগ কৰক nonce এটা যাদ্ৰিক মানৰ সৈতে ট্যাগ কৰক যাতে একে চেকেণ্ডত স্বাক্ষৰিত দুটা ৰিকোৱেষ্ট এতিয়াও পৃথক হয়।
  • এটা স্বাক্ষৰিত অনুৰোধৰ বডি সৰ্বাধিক 64 KB হ'ব পাৰে, আৰু এটা বডিৰ প্ৰয়োজন Content-Type: application/json.

এজন হেৰাই যোৱা ঘটনাৰ প্ৰতিফলন ঘটে 401 missing_nostr_authযিটো বেয়াভাৱে গঠন কৰা, বেয়াভাৱে স্বাক্ষৰ কৰা, বহুত পুৰণি, বা বেলেগ ইউ. আৰ. এল., পদ্ধতি বা বডি ৰিটাৰ্ণৰ বাবে। invalid_nostr_auth, বাৰ্তাত থকা কাৰণৰ সৈতে; পুনৰ ব্যৱহাৰ কৰা এটা ঘূৰি আহে nostr_auth_replayed. এই এণ্ডপইণ্টবোৰলৈ পঠোৱা এটা API key নাকচ কৰা হয়। বডিটো পঢ়াৰ আগতে signature পৰীক্ষা কৰা হয়, আৰু প্ৰতিটো ঠিকনায়ে প্ৰতি মিনিটত ৩০ বাৰ ইয়াৰ পৰীক্ষা বিফল কৰিব পাৰে (এটা IPv6 ঠিকনাটো তাৰ সম্পূৰ্ণ /64 হিচাপে গণ্য কৰা হয়); তাৰ পিছত ই... 429 লগত Retry-After.

ব্ৰাউজাৰসকলে কেৱল নিম্বটৰ নিজৰ ছাইটৰ পৰাই এই এণ্ড পইণ্টবোৰ কল কৰিব পাৰে (https://nymbot.ai, https://nymchat.app আৰু তেওঁলোকৰ উপ-ডমেইনসমূহ)। আন যিকোনো ছাইটৰ এটা পৃষ্ঠাই কোনো ক "ৰ্ছ হেডাৰ ঘূৰাই নাপায়, সেয়েহে তেওঁলোকে কি ঘূৰাই দিয়ে সেয়া পঢ়িব নোৱাৰে। স্ক্ৰিপ্ট আৰু স্থানীয় এপসমূহ, যিবোৰে কোনো নম্বৰ প্ৰেৰণ নকৰে Origin, প্ৰভাৱিত নহয়।

আপোনাৰ গোপন চাবিকাঠি

স্বাক্ষৰাৰ বাবে আপোনাৰ nym-ৰ গোপন চাবিকাঠীৰ (the প্রয়োজন nsec), যিয়ে সকলো নিয়ন্ত্ৰণ কৰে: আপোনাৰ পৰিচয়, আপোনাৰ ইতিহাস আৰু আপোনাৰ ভাৰসাম্য। ইয়াক কেৱল আপুনি বিশ্বাস কৰা মেচিনৰ এটা স্ক্ৰিপ্টতহে ৰাখিব, ফাইলত লিখাৰ পৰিৱৰ্তে পৰিৱেশৰ পৰা পঢ়িব, আৰু সম্ভৱ হ'লে এপটো ব্যৱহাৰ কৰিব।

এই সহায়কাৰীসকলে হেডাৰ নিৰ্মাণ কৰে। এই পৃষ্ঠাৰ পিছৰ উদাহৰণবোৰে সেইবোৰ ব্যৱহাৰ কৰে। তেওঁলোকে হেক্সত থকা গোপন চাবিটো ইয়াৰ পৰা পঢ়ে। NOSTR_SECRET_HEXcURL এ ব্যৱহাৰ কৰে নাক্। কমান্ড-লাইন সঁজুলি, যি এটা এনছেক বা হেক্স চাবি লয়, আৰু 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");
}

একাউণ্টৰ সাৰাংশ

এপটোৰ এপিআই শ্বীটটোৱে ওপৰত কি দেখুৱায়ঃ আপোনাৰ ৰাজহুৱা চাবি, দুয়োটা বেলেঞ্চ, কিমান চাবি সক্ৰিয় (প্ৰত্যাহাৰ কৰা হোৱা নাই বা ম্যাদ উকলি যোৱা নাই), আৰু স্বয়ংক্ৰিয় টপ-আপ ছেটিংছ, বা 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());

কি'সমূহ পৰিচালনা কৰক

এপটোৰ মূল তালিকাৰ পিছৰ অন্তিম বিন্দুবোৰ। সেই সকলোবোৰৰ বাবে এটা প্ৰয়োজন স্বাক্ষৰ কৰা অনুৰোধপ্ৰতিটো চাবি এই ৰূপত ঘূৰাই দিয়া হয়, আই. এছ. অ '. 8601-ত সময় আৰু ছেটত পৰিমাণৰ সৈতেঃ

মূল বস্তু

{
  "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বুলিয়ান (অনুসন্ধান)নাই।প্রত্যাহৃত কীসমূহ অন্তৰ্ভুক্ত কৰক। ডিফল্ট 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শাৰীহয়১ ৰ পৰা ৪০ টা চৰিত্ৰ, আপোনাৰ অন্যান্য সক্ৰিয় কীসমূহৰ পৰা পৃথক (কেচ উপেক্ষা কৰি)।
limit_satsপূৰ্ণসংখ্যানাই।sats-ত খৰচৰ সীমা, অন্ততঃ ১। কোনো সীমা নাথাকিলে খালি থৈ দিয়ক।
reset_periodশাৰীনাই।daily, weekly বা monthlyপ্ৰয়োজন। limit_satsইয়াক এনেকুৱা এটা টুপীৰ বাবে এৰি দিয়ক যি কেতিয়াও পুনৰ ছেট নকৰে।
expire_atশাৰী বা পূৰ্ণসংখ্যানাই।যেতিয়া চাবিকাঠিটো কাম কৰা বন্ধ কৰে: এটা ISO 8601 সময়, অথবা ১৯৭০ চনৰ পৰা অতিবাহিত মিলিছেেকেণ্ড।

উত্তৰ (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); বা ইতিমধ্যে ২৫ টা সক্ৰিয় কী (active keys) আছে (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": {…}} আপডেটেড কী অবজেক্টটোৰ সৈতে।

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আগেৰে বাতিল কৰা কী এটা পুনৰ বাতিল কৰিলে একেদৰেই উত্তৰ দিয়ে। কেৱল শেহতীয়া বাতিল কৰা ৫০ টা কীহে ৰখা হয়; আন এটা কী বাতিল কৰা হ'লে পুৰণিাসমূহ মচি পেলাওা হয়।

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

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

এন. ডব্লিউ. চি. স্বয়ংক্ৰিয়-টপ-আপ

Nostr Wallet Connect ৰ সৈতে এটা Lightning wallet সংযোগ কৰক আৰু যেতিয়া API খৰচৰ বাবে সমতা কমি যায় তেতিয়া Nymbot-এ নিজে নিজেই সমতা বৃদ্ধি কৰিব। এপটোৰ API শ্বীটত একেই ছেটিংছ আছে; এইবোৰ ইয়াৰ পিছৰ এণ্ডপইণ্টসমূহ। এই সকলোবোৰৰ এটাৰ প্ৰয়োজন আছে স্বাক্ষৰ কৰা অনুৰোধ.

ইটি কেনেকৈ কাম কৰে: যেতিয়া এটা API অনুৰোধ আপুনি বাছনি কৰা বেলেন্সৰ পৰা কাটি লোৱা হয়, যদি সেই বেলেন্সটো আপোনাৰ সীমাৰ (threshold) তললৈ নামে, Nymbot আপোনাৰ টপ-আপ পৰিমাণৰ বাবে এটা ইনভয়েচ প্ৰস্তুত কৰে, আপোনাৰ ৱালেটক সেই পৰিশোধ কৰিবলৈ কয় আৰু ক্ৰেডিট যোগ কৰে। ই প্ৰতিটো nym আৰু বেলেন্সৰ বাবে ৫ মিনিটত সৰ্বাধিক এবাৰ টপ-আপ কৰে, যাতে অনুৰোধৰ বাৰিমাত পৰিমাণে ৱালেটটো খালী কৰি পেলাব নোৱাৰে। এপসমূহৰ ভিতৰত খৰচ কৰিলে ই সক্ৰিয় নহয়। শেষ টপ-আপৰ সময় আৰু পৰিমাণ, আৰু শেষৰ ভুলটো settings ত আছে; যদি এটা ভুলৰ পিছত পৰিশোধ সম্পন্ন হয়, ইয়াৰ ইনভয়েচ পৰীক্ষা কৰিবলৈ টপ-আপ অৱস্থা ইয়াক কৃতিত্ব দিয়ক।

আপুনি এটা ৱেলট সংযোগ কৰাৰ আগতে

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

ৱালেট সংযোগ কৰি থকা হৈছে

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect - স্বাক্ষৰ কৰিছিল।

ক্ষেত্ৰখনধৰণপ্ৰয়োজনীয়বৰ্ণনা
nwc_urlশাৰীহয়সংযোগৰ শাৰী, আৰম্ভ কৰা হৈছে nostr+walletconnect://. Nymbot-এ ৱালেটটোক বিচাৰিছে get_info ইয়াক সংৰক্ষণ কৰাৰ আগতে, আৰু ইয়াক এনক্ৰিপ্ট কৰি সংৰক্ষণ কৰক।
threshold_satsপূৰ্ণসংখ্যাহয়যেতিয়া বেলেন্সটো ইমানবোৰ চেটৰ তলত পৰে তেতিয়া টপ আপ কৰক। কমেও 1,000।
topup_satsপূৰ্ণসংখ্যাহয়প্ৰতিবাৰ কিমান যোগ কৰিব লাগে। ১,০০০ ৰ পৰা ১,০০০,০০০ sats।
tierশাৰীনাই।pro (অবিকল্পিত) বা standard: চাবlagtৰ বাবে আৰু টপ আপ কৰিবলৈ স্থিতি।

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

{
  "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এই চাৰ্ভাৰৰ বাবে অটোমেটিক টপ-আপ (Automatic top-ups) অন কৰা নাই (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());

কোনো চাবি (key) নোহোৱাকৈ প্ৰতিটো অনুৰোধৰ বাবে পৰিশোধ কৰা

নিৰ্দিষ্ট মূল্যৰ এণ্ড পইণ্ট লাইটনিংৰ জৰিয়তে একে সময়তে এটা অনুৰোধৰ বাবে পৰিশোধ কৰিব পাৰি, য'ত কোনো চাবি নাই, কোনো একাউণ্ট নাই আৰু কোনো বেলেন্স নাইঃ POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations আৰু POST /embeddings. Chat, Responses আৰু Messages ৰ বাবে সদায় এটা key ৰ প্ৰয়োজন। যিটো request এ key বহন কৰে সেইটো পৰম্পৰাগতভাৱে balance ৰ পৰা বিলে কৰা হয়; payment flow কেৱল তেতিয়াহে আৰম্ভ হয় যেতিয়া কোনো key পঠোৱা নহয়।

নিমবটে একেটা ধাৰণাৰ দুটা সংস্কৰণ কয়, এটা বেকএণ্ডৰ পৰাঃ লাইটনিং লেবছ ' L402 (ইয়াৰ পুৰণি নামেৰেও গ্ৰহণ কৰা হয়, LSAT) আৰু IETF খচৰাটি পৰিশোধ ইয়াৰ সৈতে এইচ. টি. টি. পি. প্ৰমাণীকৰণ আঁচনি lightning পদ্ধতি আৰু charge অভিপ্ৰায়। আপোনাৰ গ্ৰাহকে যি বুজি পায় তাক ব্যৱহাৰ কৰক।

আপোনাৰ নিজৰ চাৰ্ভাৰ চলোৱা

চাবি অবিহনে পৰিশোধ কৰা কেৱল তেতিয়াহে সক্ৰিয় থাকে যেতিয়া API_L402_SECRET হেক্স (64 আখৰ) বা বেছ64 (44) হিচাপে কমেও 32টা যাদৃচ্ছিক বাইট ধৰি ৰাখক। 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 পেৰামিটাৰ হৈছে বেছ64ইউ. আৰ. এল. জে. এছ. অ ". এন.: {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

এটা প্ৰত্যাহ্বান এণ্ডপইণ্টটোৰ সৈতে আবদ্ধ হৈ আছে, সেইটোৰ... Content-Type (ইয়াৰ মিডিয়া টাইপ আৰু, মাল্টিপার্টৰ বাবে, ইয়াৰ সীমা) আৰু আপুনি প্ৰেৰণ কৰা সঠিক বডি বাইটৰ এছ. এইচ. এ-256 লৈ, আৰু 15 মিনিট ধৰি থাকে। পৰিশোধ কৰাৰ পিছত, পঠিওৱা একে ধৰণৰ পুনৰ অনুৰোধঃ একেই Content-Type আৰু একেটা জেএছঅ "এন বাইট, বা মাল্টিপার্ট এণ্ড পইণ্টৰ বাবে (/images/edits, /audio/transcriptions, /audio/translations) একেধৰণৰ বাউণ্ডাৰীৰ সৈতে একে ধৰণৰ মাল্টিপাৰ্ট বডি। বেছিভাগ HTTP লাইব্ৰেৰীয়ে প্ৰতিবাৰ ফৰ্ম এনকোড কৰোঁতে এটা নতুন বাউণ্ডাৰী বাছি লয়, গতিকে ইয়াক এবাৰ এনকোড কৰক আৰু সেই বাইট দুবাৰ পঠাওক।

প্ৰতিটো ঠিকনাই এক মিনিটত 30টা প্ৰত্যাহ্বান বিচাৰিব পাৰে (এটা আই. পি. ভি. 6 ঠিকনা ইয়াৰ সম্পূৰ্ণ/64 হিচাপে গণনা কৰা হয়)। যাৰ ঠিকনা জনা নাযায় সেই অনুৰোধবোৰে প্ৰতি মিনিটত 10টা কঠোৰ ভাগ কৰে, আৰু সকলো ঠিকনাত নিম্বট সমস্যাৰ প্ৰত্যাহ্বানৰ ওপৰত এক সামগ্ৰিক সীমা থাকে; এটা প্ৰত্যাহ্বান কৰাৰ আগতে অস্বীকাৰ কৰা অনুৰোধ (উদাহৰণস্বৰূপে বৈধ জে. এছ. অ ". এন নোহোৱা বস্তুৰ সৈতে) ইয়াৰ ফালে গণনা কৰা নহয়। ইয়াৰ বাহিৰে উত্তৰটো হ'ল 429 লগত Retry-After, শৰীৰটো পঢ়াৰ আগতে পঠোৱা হয়। চাবি (key) বা প্ৰমাণপত্ৰ অবিহনে আহ্বান কৰা পৰিশেষবোৰেও (endpoints) প্ৰতি ঠিকনা এটাক এশিৰা অনু মিনিটত ১২০ টা প্ৰমাণীকৰণবিহীন অনুৰোধৰ সাধাৰণ সীমাৰ ভিতৰত গণ্য কৰা হয়। শৰীৰটো পঢ়াৰ আগতে এটা প্ৰমাণপত্ৰ পৰীক্ষা কৰা হয়, আৰু এটা অনুৰোধ যাৰ Content-Type হোৱা নাই application/json (অৰু multipart/form-data আপলোডৰ বাবে) ৰ সৈতে অস্বীকাৰ কৰা হৈছে 415 আৰু কেতিয়াও এটা ইনভয়েচ নাপায়।

এম্বেডিংবোৰৰ মূল্য ইনপুটত থকা টোকেনবোৰৰ আনুমানিক মূল্যৰ পৰা এটা 1.5× মাৰ্জিনৰ সৈতে নিৰ্ধাৰণ কৰা হয়, যিহেতু প্ৰকৃত গণনা কেৱল তাৰ পিছতহে জনা যায়। আপুনি প্ৰকৃততে ব্যৱহৃত টোকেনবোৰৰ বাবে পৰিশোধ কৰে, আৰু পৰিশোধৰ অব্যৱহৃত অংশটো এটা হিচাপে ঘূৰি আহে। ৰিফাণ্ড টকেন.

পেমেন্ট পঠিয়াই আছোঁ

যিকোনো Lightning wallet ৰ সৈতে ইনভয়চটো পৰিশোধ কৰক। ৱালেটটোৱে আপোনাক preimage প্ৰদান কৰিব, যিটো ৬৪ টা hex ক্যৰেক্টাৰৰ হ'ব। তাৰপাছত এইবোৰৰ যিকোনো এটাৰ সৈতে একেই ৰিকোৱেষ্টটো পঠিয়াওক:

আঁচনিশীৰ্ষক
L402Authorization: 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প্ৰমাণপত্ৰটো বিকৃত, নিম্বটে জাৰি কৰাৰ পিছত সলনি কৰা হৈছিল, বা পেমেণ্ট হেছ নাম দিয়া হৈছিল যাৰ বাবে নিম্বটে কেতিয়াও চালান জাৰি কৰা নাছিল। নিম্বটে নাজানে বা দ্বন্দ্বপূৰ্ণ সতৰ্কবাণীৰ সৈতে এটা মেকাৰুনক অস্বীকাৰ কৰা হয়।
429 rate_limit_exceededপৰীক্ষা কৰাত ব্যৰ্থ হোৱা 30 টাতকৈ অধিক প্ৰমাণপত্ৰ বা চাবি এক মিনিটত এই ঠিকনাৰ পৰা আহিছিল, বা এটা ৰিফাণ্ড টোকেন এক মিনিটত 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"); যদি ৰেন্ডাৰটো বিলিং অবিহনে বিফল হয়, তেন্তে পেমেন্টটো তাৰ ওপৰত পৰে। স্থিতি URL টোৱে দেখুৱায় refund_sats এটা ৰিফাণ্ড কৰা চাকৰিৰ বাবে কিন্তু টোকেন কেতিয়াও নহয়, সেয়েহে স্থিতিৰ ইউ. আৰ. এল. শ্বেয়াৰ কৰিলে ৰিফাণ্ড ভাগ-বতৰা নকৰে। টোকেনটো পৰীক্ষা কৰিলেও এটা বিফল কাম নিষ্পত্তি হয় যিটো কোনেও ভোট দিয়া নাছিল।

ধন ঘূৰাই দিয়া

যদি এটা পেইড অনুৰোধ বিফল হয় আৰু প্ৰদানকাৰীয়ে এই প্ৰচেষ্টাৰ বাবে নিমবটক বিল দিয়ে, তেন্তে পেমেণ্টটো ৰখা হয় আৰু ত্ৰুটিটোৱে এইদৰে কয়, 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 অবজেক্টটোৱে হেৰুওৱা বস্তুটোৰ বাবে ৰিফাণ্ড টোকেন বহন কৰে; এটা ট্ৰান্সক্ৰিপশ্যন যাৰ দৈৰ্ঘ্য আগলৈ পঢ়িব নোৱাৰি তাৰ মূল্য ফাইলটোৰ দীৰ্ঘতম সময়ৰ বাবে (কেতিয়াও 30 মিনিটতকৈ অধিক নহয়), আৰু প্ৰকৃত দৈৰ্ঘ্যৰ পাৰ্থক্যটো ৰিফাণ্ড টোকেন হিচাপে ঘূৰি আহে; যদি ই 30 মিনিটতকৈ অধিক দীঘল হয়, ইয়াক ইয়াৰ সৈতে অস্বীকাৰ কৰা হয় 413 আৰু সম্পূৰ্ণ পৰিশোধ ঘূৰি আহে। অন্তৰ্ভুক্তিবোৰে অনুমানটো ৰখাই ৰখাখিনি ঘূৰাই দিয়ে। এটা বিফল ভিডিঅ'টোকেনত ইয়াৰ দাখিল ঘূৰাই দিয়ে।

ৰিফাণ্ড টোকেন হৈছে এক যাদৃচ্ছিক 256-বিট কোড। নিম্বটে কেৱল ইয়াৰ হেছ সংৰক্ষণ কৰে, আৰু ইয়াৰ ম্যাদ 30 দিনৰ পিছত শেষ হয়। ই এটা চেট বেলেন্স ধৰি ৰাখে, আৰু আপুনি কৰিব পাৰেঃ

  • ইয়াৰ সৈতে ধন পৰিশোধ কৰক। পঠিওৱা Authorization: Bearer REFUND-… ওপৰৰ যিকোনো অন্তিম বিন্দুত (এটা অ'পেনএআই এছডিকে ইয়াক ইয়াৰ এপিআই চাবি হিচাপে লয়)। মূল্য টোকেনৰ পৰা আহে আৰু যি বাকী থাকে সেয়া তাত থাকে (refund_token_sats তাৰ ভিতৰত nymbot বস্তু)। অনুৰোধৰ উত্তৰতকৈ কম মূল্যৰ টোকেন। 402 refund_insufficient; এটা বিল নকৰা বিফলতাই চেটবোৰক একেটা টোকেনত ঘূৰাই আনে।
  • পৰীক্ষা কৰক। GET /api/v1/l402/refunds একেটা হেডাৰৰ সৈতে ঘূৰি আহে {"sats": 237, "status": "open", "expires_at": "..."}.
  • এটা টোকেন এক মিনিটত সৰ্বাধিক 60 বাৰ ব্যৱহাৰ কৰিব পাৰি।
  • ইয়াক এটা এন. আই. এম. লৈ স্থানান্তৰ কৰক। ইয়াক পেষ্ট কৰক উপহাৰ এটা ঘূৰাই দিয়া নিম্বট এপত, বা কল কৰক POST /api/v1/l402/refunds/redeem এ-ৰ সৈতে স্বাক্ষৰ কৰা অনুৰোধ আৰু {"refund_token": "REFUND-...", "balance": "standard"} (অৰু "pro"). সম্পূৰ্ণ ক্ৰেডিট বেলেন্সলৈ যায় (প্ৰতিটো ষ্টেণ্ডাৰ্ডত 10টা চেট, প্ৰ "ত 100টা); যিবোৰ চেটে সম্পূৰ্ণ ক্ৰেডিট নকৰে সেইবোৰ এপিআই অনুৰোধৰ টোকেনত থাকে।

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