មូលដ្ឋានចំណេះដឹង អ្នកបង្កើត
គោលបំណង Top-ups និង Keys
ពិនិត្យមើលអ្វីដែលអ្នកមាន, ពិនិត្យឡើងវិញលើ Lightning, ពិនិត្យឡើងវិញដោយស្វ័យប្រវត្តិពីកុំព្យូទ័ររបស់អ្នក, ពិនិត្យឡើងវិញតម្លៃនៃសំណួរមួយចំនួននិងគ្រប់គ្រងគោលដៅពីកូដ។
ទំព័រនេះត្រូវបានបកប្រែដោយម៉ាស៊ីនសម្រាប់ភាពងាយស្រួល។ ភាសាអង់គ្លេសដើមគឺជាកំណែដែលអនុវត្ត។
ការត្រួតពិនិត្យការអនុម័ត
ទោះជាយ៉ាងណាក៏ដោយវាទាំងពីរនៃការជឿទុកចិត្តរបស់អ្នកនិងចំនួននៃការជឿទុកចិត្តរបស់គាត់ត្រូវបានប្រើ។
GET https://nymbot.ai/api/v1/credits/balance តើអ្នកត្រូវការគោលបំណង API POST ដូច្នេះវាអាចធ្វើបានសម្រាប់អតិថិជនដែលមានអារម្មណ៍។
balance វាត្រូវបានគេហៅថា Bitcoin គឺជាឧបករណ៍ដែលគួរឱ្យចាប់អារម្មណ៍ក្នុងការធ្វើតេស្តមួយចំនួន (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);
វិធីការទូទាត់
តើធ្វើដូចម្តេចដែលអ្នកអាចកើនឡើង, និងការកាត់បន្ថយ. Lightning គឺជាវិធីតែមួយ.
GET https://nymbot.ai/api/v1/topup/payment-methods មិនចាំបាច់មានគន្លឹះ
កម្រិតខ្ពស់គឺ 10 ទៅ 1,000,000 កម្រិតខ្ពស់; កម្រិតខ្ពស់ដែលមានជំនាញវិជ្ជាជីវៈគួរតែទិញកម្រិតខ្ពស់បំផុតមួយ, ដូច្នេះវាចាប់ផ្តើមនៅ 100 កម្រិតខ្ពស់។ កម្រិតខ្ពស់នៃដុល្លារបន្ទាប់ពីតម្លៃ Bitcoin ។ bulk_bonus វាត្រូវបានបញ្ចូលគ្នានៃការគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណនានៃគណ
ឆ្លើយតប
{
"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 ដែលបន្ថែមគណនីគណនីដែលគោលបំណងរបស់វា។ បង់វាពីកុំព្យូទ័រ Lightning ទាំងអស់បន្ទាប់មក ពិនិត្យឡើងវិញ ដើម្បីទទួលបានអត្ថប្រយោជន៍បានបន្ថែម
POST https://nymbot.ai/api/v1/topup/create/btc-lightning តើអ្នកត្រូវការគោលបំណង API
| តំបន់ | ប្រភេទ | តម្រូវការ | ការបោះពុម្ព |
|---|---|---|---|
amount | ដំណឹង | បាទ | ទោះជាយ៉ាងណា, នៅ ក្នុង currencyទោះជាយ៉ាងណាក៏ដោយមានចំនួនទាំងអស់សម្រាប់ sats ។ |
currency | ដំណឹង | មិន | SATS (ប្រសិនបើមានការបញ្ហានេះទេ) USD ឬ BTCDollars ត្រូវបានផ្លាស់ប្តូរនៅលើតម្លៃ Bitcoin ឥឡូវនេះ។ |
tier | ដំណឹង | មិន | pro (តម្រូវការ) ឬ standard: ការកំណត់គោលបំណងដែលគោលបំណងគោលបំណងគោលបំណងនេះ។ |
សញ្ញាបនប័ត្រធម្មតាគឺ 10 sats និងសញ្ញាបនប័ត្រ Pro 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} — អ្នកត្រូវការគោលបំណងពី nym ដែលបានបង្កើតគណនី។
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 | ID នេះមិនមែនជា ID 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 | ប្រព័ន្ធ ប្រតិបត្តិការ integer (query) | មិន | ទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំទំហំ 400 invalid_value. |
page_count | ប្រព័ន្ធ ប្រតិបត្តិការ integer (query) | មិន | ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ ទំហំ |
start_dateend_date | ប្រព័ន្ធ ប្រតិបត្តិការ string (query) | មិន | ISO 8601 ថ្ងៃឬពេលវេលា។ |
model | ប្រព័ន្ធ ប្រតិបត្តិការ string (query) | មិន | ម៉ូដែលនេះតែ |
type | ប្រព័ន្ធ ប្រតិបត្តិការ string (query) | មិន | chat, responses, messages, image, video, speech, transcription ឬ embedding. |
all_keys | ហ្វេសប៊ុក (Query) | មិន | ជាមួយគោលបំណង: true ប្រព័ន្ធ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ false. |
key_id | ប្រព័ន្ធ ប្រតិបត្តិការ string (query) | មិន | ជាមួយនឹងការសរសេរគោលបំណងឬជាមួយ 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);
ការចុះឈ្មោះគណនីគណនី
ការបង្កើត, ការផ្លាស់ប្តូរនិងការប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែ
កម្មវិធីនេះធ្វើដូចនេះសម្រាប់អ្នក: អ្វីគ្រប់យ៉ាងនៅក្នុងការរបស់ខ្លួន អាក្រក់ អ្នកត្រូវតែផ្នែកនេះដើម្បីគ្រប់គ្រងគោលដៅពីកូដរបស់អ្នក។
សៀវភៅនេះគឺជាប្រវត្តិសាស្រ្ត Nostr នៃប្រភេទ 27235 (NIP-98) ដែលត្រូវបានផ្ញើដោយ base64-coded នៅលើ
Authorization Header ជាមួយ Word 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": "..."
}
uis the full URL of the request, query string included, precisely as sent. គឺជាអាសយដ្ឋានអាសយដ្ឋានពេញលេញនៃសំណួរដែលរួមបញ្ចូលគ្នានេះ។methodនេះគឺជាវិធី HTTP ។payloadនេះគឺជា SHA-256 នៃប្រព័ន្ធទម្រង់សម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈសម្ភារៈPOSTនិងPATCHទោះជាយ៉ាងណាក៏ដោយអ្នកចង់ផ្ញើអ៊ីនធឺណិតទៅកាន់គេហទំព័ររបស់អ្នក។ អ្នកអាចផ្ញើអ៊ីនធឺណិតទៅកាន់គេហទំព័ររបស់អ្នក។created_atវាត្រូវបានរក្សាទុកក្នុងរយៈពេល 60 វិនាទីពីម៉ាស៊ីនបម្រើរបស់អ្នក។- ការធ្វើការទាំងអស់គឺជាការធ្វើការមួយចំនួន, a
GETការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងការបញ្ចូលគ្នានៅក្នុងnonceសៀវភៅជាមួយនឹងគុណសម្បត្តិដូច្នេះការសៀវភៅទាំងពីរដែលបានសៀវភៅក្នុងមួយដងដូច្នេះគួរតែខុសគ្នា។ - ប្រព័ន្ធ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ
Content-Type: application/json.
ការប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែ 401 missing_nostr_authមួយដែលត្រូវបានបង្កើតឡើងយ៉ាងទូលំទូលាយ, បានចុះឈ្មោះយ៉ាងទូលំទូលំទូលាយ, ប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែលប្រហែល
invalid_nostr_authដោយសារតែការប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែប្រែ
nostr_auth_replayedសៀវភៅនេះត្រូវបានត្រួតពិនិត្យឡើងវិញមុនពេលដែលសៀវភៅនេះត្រូវបានអាន, និងអាសយដ្ឋានទាំងអស់អាចជួសជុលវា 30 ដងក្នុងមួយ នាទី (អាសយដ្ឋាន IPv6 បានគិតថាជា /64) ។ បន្ទាប់ពីនេះវាបានទទួលបាន 429 ជាមួយ
Retry-After.
កុំព្យូទ័រអាចចែកចាយបញ្ហាទាំងនេះពីគេហទំព័ររបស់ Nymbot ។ (https://nymbot.ai,
https://nymchat.app ទំព័រមួយនៅលើគេហទំព័រណាមួយផ្សេងទៀតមិនទទួលបានកំណត់ CORS បានមកវិញដូច្នេះវាមិនអាចអានអ្វីដែលពួកគេមកវិញ។ សៀវភៅនិងកម្មវិធីដើមដែលមិនផ្ញើអាន
Originហើយពួកគេត្រូវបានកាត់បន្ថយ។
ការសរសេរគោលបំណងគោលបំណងគោលបំណងរបស់គោលបំណងរបស់គោលបំណងរបស់គោលបំណងរបស់គោលបំណងរបស់គោលបំណងរបស់គោលបំណងរបស់គោលបំណងរបស់គោលបំណងរបស់គោលបំណង nsec), ដែលត្រួតពិនិត្យអ្វីគ្រប់យ៉ាង: សមត្ថភាពរបស់អ្នក, ការប្រវត្តិសាស្រ្តរបស់អ្នកនិងការជឿទុកចិត្តរបស់អ្នក។ គ្រាន់តែដាក់វានៅក្នុងសៀវភៅនៅលើម៉ាស៊ីនដែលអ្នកជឿទុកចិត្ត, ការអានវាពីបរិស្ថានជាងការសរសេរវាទៅក្នុងឯកសារ, និងចំពោះកម្មវិធីនៅពេលដែលអ្នកអាច។
អ្នកជំនួយទាំងនេះបានបង្កើត header ។ ឧទាហរណ៍បន្ទាប់ពីនេះនៅលើទំព័រនេះបានប្រើវា។ ពួកគេបានសរសេរគោលបំណងសុវត្ថិភាពនៅក្នុង hex ពី NOSTR_SECRET_HEX; cURL មួយ ដែលប្រើប្រាស់
សត្វ ឧបករណ៍បញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជាការបញ្ជា 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 របស់កម្មវិធីនេះបង្ហាញពីអ្វីដែលមាននៅខាងលើ: គោលបំណងសាធារណៈរបស់អ្នក, គោលបំណងទាំងពីររបស់អ្នក, គោលបំណងជាច្រើនដែលមានប្រសិទ្ធិភាព (មិនត្រូវបានបាត់បន្ថយឬបាត់បន្ថយ) និង គោលបំណង 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:
គោលបំណង
{
"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) | មិន | បញ្ចូលបញ្ចូលបញ្ចូលបញ្ចូលបញ្ចូលបញ្ចូលបញ្ចូលបញ្ចូលបញ្ចូល 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 | ដំបូង | មិន | ទោះជាយ៉ាងណាក៏ដោយគ្មានការទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទូទាត់ទូទាត់ទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទូទាត់ទូទូទូទាត់ទូទូទូទូទាត់ទូទូទូទូទូទាត់ទូទូទូទូទូទូទូទូទ |
reset_period | ដំណឹង | មិន | daily, weekly ឬ monthlyតម្រូវការ limit_satsសូមចែកចាយវាសម្រាប់ជញ្ជាំងដែលមិនអាចដំឡើងបានទេ។ |
expire_at | string ឬ integer ។ | មិន | នៅពេលដែលគោលបំណងមិនធ្វើការ: ពេល 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 ។ កំហុសរហូតដល់ 1 ។ កំហុសរហូតដល់ 1 ។ កំហុសរហូតដល់ 1 ។ កំហុសរហូតដល់ 1 ។ កំហុសរហូតដល់ 1 ។ កំហុសរហូតដល់ 1 ។unknown_parameter); ឬ 25 កុំព្យូទ័រដែលមានប្រសិទ្ធិភាពឥឡូវនេះ (too_many_keys). |
429 | លើសពី 60 កុំព្យូទ័រដែលបានធ្វើឡើងដោយ nym នេះ, ឬ 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());
ក្រុមហ៊ុន NWC Auto-Top-Up
ការផ្លាស់ប្តូរទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទទូរស័ព្ទ សៀវភៅសៀវភៅ.
តើធ្វើដូចម្តេចដើម្បីធ្វើការ: បន្ទាប់ពីការទូទាត់ការទូទាត់ API ត្រូវបានទូទាត់ទៅលើការទូទាត់ដែលអ្នកជ្រើសរើសដើម្បីមើល, ប្រសិនបើការទូទាត់នេះបានកាត់បន្ថយក្រោមតម្រូវការរបស់អ្នក, Nymbot បានធ្វើការទូទាត់សម្រាប់ប្រាក់ចំណេញរបស់អ្នក, សូមទូទាត់ទូទាត់របស់អ្នកដើម្បីទូទាត់វា, និងបន្ថែមគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណនីគណ សកម្មភាព Top-Up ការគណនានេះ។
Nymbot បានរក្សាទុកវាជាការសាកល្បងនិងគ្រាន់តែប្រើវាដើម្បីទូទាត់ទិន្នន័យផ្ទាល់ខ្លួនរបស់វាប៉ុន្តែធ្វើឱ្យការសាកល្បងសម្រាប់វាដោយមានការទូទាត់ការទូទាត់នៅក្នុងទូទាត់របស់អ្នកដូច្នេះច្រើនបំផុតដែលវាអាចទូទាត់គឺជាទូទាត់ដែលបានជ្រើសរើសអ្នក។ កុំព្យូទ័រនេះត្រូវគាំទ្រ pay_invoice.
ការទាញយក កុំព្យូទ័រ
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect សៀវភៅ
| តំបន់ | ប្រភេទ | តម្រូវការ | ការបោះពុម្ព |
|---|---|---|---|
nwc_url | ដំណឹង | បាទ | ការផ្លាស់ប្តូរការផ្លាស់ប្តូរដែលចាប់ផ្តើម nostr+walletconnect://Nymbot អនុញ្ញាតឱ្យប្រាក់រង្វាន់សម្រាប់ get_info នៅពេលដែលអ្នកបានរក្សាទុកវានិងរក្សាទុកវាបានកំណត់។ |
threshold_sats | ដំបូង | បាទ | ទោះជាយ៉ាងណាក៏ដោយខ្ញុំព្យូទ័ររបស់យើងបានកាត់បន្ថយការកាត់បន្ថយការកាត់បន្ថយការកាត់បន្ថយការកាត់បន្ថយការកាត់បន្ថយការកាត់បន្ថយការកាត់បន្ថយការកាត់បន្ថយការកាត់បន្ថយ។ |
topup_sats | ដំបូង | បាទ | ទោះជាយ៉ាងណាក៏ដូច្នេះវាអាចធ្វើបានយ៉ាងណា? 1000 ទៅ 1,000,000 sats. |
tier | ដំណឹង | មិន | 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នេះដូច្នេះប្រសិនបើមានលក្ខណៈសម្បត្តិដូច្នេះប្រសិនបើមានលក្ខណៈសម្បត្តិទាំងពីរផ្សេងទៀត។ |
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 '
អេឡិចត្រូនិច (ប្រសិនបើបានទទួលស្គាល់នៅក្រោមឈ្មោះដំបូងរបស់ខ្លួនផងដែរ) LSAT) និងគម្រោង IETF
ការបង់ប្រាក់ HTTP authentication ប្រព័ន្ធជាមួយ lightning ឧបករណ៍ និង
charge សូមប្រើអ្វីដែលអតិថិជនរបស់អ្នកបានដឹង។
ការទូទាត់ដោយគ្មានគោលបំណងគឺនៅតែនៅពេលដែល API_L402_SECRET មានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើមានប្រសិនបើ openssl rand -hex 32ទោះជាយ៉ាងណាក៏ដោយគ្នានេះមិនមែនជាតម្លៃដែលអាចជឿទុកចិត្តឬមានតម្លៃដែលអាចជឿទុកចិត្តនោះទេ។ API_L402_SECRET_PREVIOUS ក្នុងមួយថ្ងៃ: វិញ្ញាបនប័ត្រអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋានអាសយដ្ឋាន
គោលដៅ
សូមផ្ញើអតិថិជនជាមួយ No Authorization កុំព្យូទ័រ: ប្រសិនបើវាជាការត្រឹមត្រូវ, គ្មានអ្វីដែលធ្វើបាន, និងអ្នកទទួលបាន 402 Payment Required ជាមួយនឹងការទូទាត់សម្រាប់ការទូទាត់ដូចគ្នានេះមានតម្លៃដូចគ្នានេះ: តម្លៃដូចគ្នានេះគោលបំណងនឹងទូទាត់ការផ្លាស់ប្តូរនៅលើ 10 sats មួយគោលបំណងគោលបំណងឬ 100 sats មួយគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណង។ 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 ទិដ្ឋភាព JSON base64url:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
គោលបំណងនេះត្រូវបានបំពាក់ទៅនឹងការបញ្ចប់នៃការ Content-Type (ប្រភេទប្រព័ន្ធផ្សព្វផ្សាយរបស់វានិងសម្រាប់ភាគច្រើនបញ្ហានៃវា) និងទៅ SHA-256 នៃប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយសូម្បីតែប្រព័ន្ធផ្សព្វផ្សាយ។ ដោះស្រាយ សូមអរគុណសម្បត្តិដូច្នេះ។
Content-Type និង JSON bytes មួយដូចគ្នា, ឬសម្រាប់កំណត់ផ្នែកជាច្រើន (/images/edits, /audio/transcriptions, /audio/translationsជាច្រើននៃសៀវភៅ HTTP បានជ្រើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើសរើស។
ទោះជាយ៉ាងណាក៏ដោយប្រព័ន្ធប្រតិបត្តិការ IPv6 គឺជាប្រព័ន្ធប្រតិបត្តិការអ៊ីនធឺណិតដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ។ ប្រព័ន្ធប្រតិបត្តិការ IPv6 មានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ។ ប្រព័ន្ធប្រតិបត្តិការ IPv6 មានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ដែលមានប្រព័ន្ធប្រតិបត្តិការ IPv6 ។ 429 ជាមួយ Retry-Afterការសរសេរសៀវភៅអ៊ីនធឺណិតដែលត្រូវបានទាញយកដោយអ៊ីនធឺណិតដែលមិនមានគោលបំណងឬវិញ្ញាបនប័ត្រផងដែរត្រូវបានគណែនាំទៅនឹងការបញ្ជាទូទៅនៃការសរសេរសៀវភៅអ៊ីនធឺណិតដែលមិនមានការសរសេរសៀវភៅអ៊ីនធឺណិតដែលមិនមានការសរសេរសៀវភៅអ៊ីនធឺណិតដែលមិនមានការសរសេរសៀវភៅអ៊ីនធឺណិត។ ការសរសេរសៀវភៅអ៊ីនធឺណិតត្រូវបានត្រួតពិនិត្យមុនពេលសរសេរសៀវភៅអ៊ីនធឺណិតនិងការសរសេរសៀវភៅអ៊ីនធឺណិត Content-Type មិន application/json (ឬ
multipart/form-data ដោយសារតែការទាញយកវាត្រូវបានទាញយកដោយ 415 ហើយគាត់មិនទទួលបានគណនីទេ។
លក្ខណៈពិសេសនៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូលគ្នានៃការបញ្ចូល។ គោលបំណង Token.
ការទូទាត់
ការទូទាត់ទូទាត់ជាមួយនឹងទូទាត់ Lightning ទាំងអស់។ ទូទាត់ផ្តល់ឱ្យអ្នកនូវរូបថតមុន, 64 សៀវភៅ hex ។ បន្ទាប់មកផ្ញើសំណួរដូចគ្នាជាមួយនឹងមួយនៃការទាំងនេះ:
| គម្រោង | មាត្រា |
|---|---|
| អេឡិចត្រូនិច | 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 គោលបំណងដែលបានទូទាត់ជាមួយគោលបំណងការទូទាត់ក៏ទទួលបានការ Payment-Receipt header (base64url JSON with the challenge id, ការទូទាត់ hash as reference, status និង
timestampការទូទាត់គម្រោងមិនត្រូវបានបណ្តុះបណ្តាលជាមួយគណនីណាមួយដូច្នេះពួកគេមិនបង្ហាញនៅក្នុងប្រវត្តិសាស្រ្តការទូទាត់។
| សមត្ថភាព | ពេលដែល |
|---|---|
402 payment_already_used | ការទូទាត់ទាំងអស់ត្រូវបានទូទាត់សម្រាប់ការទូទាត់មួយ។ ឆ្លើយតបនេះគឺជាការសាកល្បងថ្មីសម្រាប់ការទូទាត់នេះ, ដូច្នេះអតិថិជនដែលបានកាត់បន្ថយវិញ្ញាបនប័ត្រចុងក្រោយរបស់ពួកគេ (ដូចជា lnget (ប្រសិនបើ) ជាការពិតណាស់តែជាការពិតប្រាកដ។ |
402 payment_mismatch | គោលនយោបាយនេះត្រូវបានអនុញ្ញាតឱ្យអ្នកទទួលបានអត្ថប្រយោជន៍សម្រាប់បញ្ចប់ផ្សេងទៀត Content-Type ឬទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទូទាត់ទូទូទាត់ទូទូទូទាត់ទូទូទូទូទ គោលបំណង Token (refund_token និង refund_sats ក្នុងរាងកាយនេះ) |
402 payment_expired | លើសពី 15 នាទីមកហើយចាប់តាំងពីការជោគជ័យ ការជោគជ័យថ្មីមកជាមួយនឹងការជោគជ័យថ្មី។ ប្រសិនបើរូបថតមុនបានបង្ហាញថាអ្នកបានទូទាត់អ្វីដែលអ្នកបានទូទាត់មកវិញជាការជោគជ័យ គោលបំណង Token (refund_token និង refund_sats ក្នុងរយៈពេល ២ វិនាទីនេះ, អ្នកអាចរកបានការប្រើប្រាស់ដែលអាចប្រើបាន។ |
401 invalid_preimage | រូបថតគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូគំរូ |
401 invalid_payment_credential | វាត្រូវបានផ្លាស់ប្តូរបន្ទាប់ពី Nymbot បានបោះពុម្ពវាត្រូវបានផ្លាស់ប្តូរបន្ទាប់ពី Nymbot បានបោះពុម្ពវាត្រូវបានផ្លាស់ប្តូរបន្ទាប់ពី Nymbot បានបោះពុម្ពវាត្រូវបានផ្លាស់ប្តូរបន្ទាប់ពី Nymbot បានបោះពុម្ពវាត្រូវបានផ្លាស់ប្តូរបន្ទាប់ពី Nymbot បានបោះពុម្ពវាត្រូវបានផ្លាស់ប្តូរបន្ទាប់ពី Nymbot បានបោះពុម្ពវាត្រូវបានផ្លាស់ប្តូរ។ |
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 ជាមួយនឹងវិធីសាស្រ្ត Lightning ការដោះស្រាយការជំរុញការទូទាត់ដោយខ្លួនឯង; បង្ហាញពួកគេនៅទីបញ្ចប់និងអនុញ្ញាតឱ្យពួកគេទូទាត់។
រូបភាព
ការបង់ប្រាក់ 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"); ប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើឱ្យប្រសិនបើការធ្វើការ
refund_sats សម្រាប់ការងារដែលត្រូវបានទូទាត់ប៉ុន្តែមិនមែនជា token, ដូច្នេះការផ្គត់ផ្គង់ URL របស់ស្ថានភាពមិនមែនជាការផ្គត់ផ្គង់ការទូទាត់។ ការត្រួតពិនិត្យ token នេះក៏បានកាត់បន្ថយការងារដែលមិនមែនជាអ្នកគាំទ្រ។
ការទូទាត់
ប្រសិនបើការទូទាត់គោលបំណងមិនជោគជ័យហើយអ្នកផ្គត់ផ្គង់បានទូទាត់ Nymbot សម្រាប់ការធ្វើការនេះ, ការទូទាត់ត្រូវបានរក្សាទុកនិងការបញ្ជាក់គោលបំណងគឺដូច្នេះ។ 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 ប្រព័ន្ធ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ ប្រតិបត្តិការ 413
និងការទូទាត់ទាំងអស់ត្រូវបានទូទាត់។ ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទាត់ទូទូទូទាត់ទូទូទាត់ទូទូទូទាត់ទូទូ
កូដប្រាក់រង្វាន់ជាកូដ 256-bit ដែលជាកូដទូទៅ។ Nymbot បានរក្សាទុកគោលបំណងរបស់គាត់តែប៉ុណ្ណោះហើយវាត្រូវបានបញ្ចប់បន្ទាប់ពី 30 ថ្ងៃ។ វាត្រូវបានរក្សាទុកគោលបំណងរបស់គាត់ហើយអ្នកអាច:
- ការទូទាត់ជាមួយ។ បញ្ចូល
Authorization: Bearer REFUND-…កុំព្យូទ័ររបស់យើងគឺជាផ្នែកមួយនៃផ្នែកមួយដែលមានប្រសិទ្ធិភាពក្នុងការធ្វើឱ្យប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសិនបើអ្នកមានប្រសrefund_token_satsនៅក្នុងnymbotគោលបំណង។ គោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណង402refund_insufficient; ការបញ្ឈប់ការបញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ឈប់បញ្ចប់ - សូមមើលវា
GET /api/v1/l402/refundsទោះបីជា header ដែលបានចូលទៅក្នុង{"sats": 237, "status": "open", "expires_at": "..."}. - មួយ token អាចត្រូវបានប្រើជាច្រើនជាង 60 ដងក្នុងមួយ នាទី។
- សូមផ្លាស់ប្តូរវាទៅលើ NYM ។ បង្ហោះនៅលើ សូមអរគុណអរគុណ ក្នុងកម្មវិធី Nymbot, ឬ Call
POST /api/v1/l402/refunds/redeemជាមួយ A សៀវភៅសៀវភៅ និង{"refund_token": "REFUND-...", "balance": "standard"}(ឬ"pro"ការគណនានិងការគណនានិងការគណនានិងការគណនានិងការគណនានិងការគណនានិងការគណនានិងការគណនានិងការគណនាន។
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 } }