រំលងទៅមាតិកា
ជំរុញ Nymbot

មូលដ្ឋានចំណេះដឹង អ្នកបង្កើត

គោលបំណង 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
}
សមត្ថភាពពេលដែល
400ID នេះមិនមែនជា 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_date
end_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": "..."
}
  • u is 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_atstring ឬ 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 សូមប្រើអ្វីដែលអតិថិជនរបស់អ្នកបានដឹង។

ប្រព័ន្ធ ប្រតិបត្តិការ Server របស់ អ្នក

ការទូទាត់ដោយគ្មានគោលបំណងគឺនៅតែនៅពេលដែល 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 គោលបំណង។ គោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណងគោលបំណង 402 refund_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 } }