መሰረት ፍልጠት ደቨሎፐራዊት (ኣልጋእ ስራሕ)
ሚዛን፣ መተเติมታትን ከ ቁልፍታት ጋር
ዝበለኻዮ ነገር ፈትሽ፣ ብLightning መ sufficiently ጥገ፣ ካብ ናትኩም ወለት ኣውቶማትጊ ኣተሓባብኩ፣ ሓደ ሓደ ሕቶ ክሳብ ክንደይ ከፍነት ከም ዝኸፍል ተዓዘብ፣ ከምኡ እውን ካብ ኮድ ቁልፍታት (keys) ኣእላኽ።
እዚ ገጽ ንመመላእታ ብማሽን ዝተተርጎመ እዩ። እቲ ናይ እንግሊዝኛ ኦሪጅናል እቲ ዝምልከቶ ስሪት እዩ።
እቲ ቁጠባ ምታይ ምዃኑ ምርግጋጽ
ክልቲኦም ኣበጻሕትታትካ፣ ከወ ክንደይ ወሰን እዚ ቁልፊ ተጠቒሙ ከምዘሎ።
GET https://nymbot.ai/api/v1/credits/balance — API key የኻበ perlu ኣሎ። POST ንዘቕትውዎ ዓሚልቲ ድማ ይሰርሕ እዩ።
balance ብጸባዊ ዋጋ ቢትኮይን፣ ክልተ እቶም ተመጣጣኒታት ብሓባR ብዶላር ተሓዲሶም ድዩ፧ ንሓደ ጥራይ ቁጽሪ ዝውስውን መሳርሒታት ንምርካብ (null ሰይቲ ዋጋ ክቕራእ እንተዘይከበየ)። ተ 나머지 ክሬዲት (credits) ከምኡውን ሳትሺ (sats) እዩ፡ እዚ ድማ እቲ ናይ ባላንስ መወከሲነት እዩ። 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);
ኣገባብ ክፍሊትታት
ከመገብሪ (top up) ከመኣHow ክትገብር ትኽእል፣ ከምኡ እውን ገደብታቱ። Lightning ጥንታዊ መገብሪ ጥራይ እዩ።
GET https://nymbot.ai/api/v1/topup/payment-methods — ቁልፊ ኣይፋልን ኣድልዩ።
ቶፕ-ኣፕ ካብ 10 ክሳብ 1,000,000 sats እዩ፤ ፕሮ ቶፕ-ኣፕ <em>on least* ሓደ ፕሮ ክሬዲት ክትብዛሕ ኣለዎ፣ ስለዚ ካብ 100 sats ይጅምር። ናይ ዶላር ገደብ ምስ ዋጋ ቢትኮይን ይኸይድ እዩ። bulk_bonus ኣብቲ ዓብዮት ዝበለጸ መተግበሪ (app) ከምዘሎ፡ ኣብቲ ዝዓበየ መተเติม (top-up) ዝተወሳኺ ብር (credit) ዘርእይ፦ ኣብቲ መደበኛ መተเติม ካብ 500፣ 1,000 ወይ 5,000 sats፡ 10%, 15% ወይ 20% ዝተወሳኺ፣ ኣብ Pro መተเติม ድማ ካብ 5,000፣ 10,000 ወይ 50,000 sats ዝተወሳኺ።
መልሲ
{
"supported_methods": [
{
"method": "btc-lightning",
"display_name": "Bitcoin Lightning",
"supported_currencies": ["SATS", "USD", "BTC"],
"limits": {
"SATS": { "min": 10, "max": 1000000 },
"USD": { "min": 0.02, "max": 1170 },
"BTC": { "min": 1e-7, "max": 0.01 }
},
"tiers": ["standard", "pro"],
"default_tier": "pro",
"tier_min_sats": { "standard": 10, "pro": 100 },
"sats_per_credit": { "standard": 10, "pro": 100 },
"bulk_bonus": [
{ "bonus": 0.1, "standard_sats": 500, "pro_sats": 5000 },
{ "bonus": 0.15, "standard_sats": 1000, "pro_sats": 10000 },
{ "bonus": 0.2, "standard_sats": 5000, "pro_sats": 50000 }
]
}
]
}
cURL
curl https://nymbot.ai/api/v1/topup/payment-methods
Python
import requests
methods = requests.get("https://nymbot.ai/api/v1/topup/payment-methods").json()
print(methods["supported_methods"][0]["limits"])
JavaScript
const methods = await (await fetch("https://nymbot.ai/api/v1/topup/payment-methods")).json();
console.log(methods.supported_methods[0].limits);
ብ Lightning መጠን ምሃብ
ቲ key ዝተሓሓዘሉ ኣስማ ክሬዲት ዝውስኽ ናይ Lightning ፋክቱራ ይፈጥር። ካብ ዝኾነ ናይ Lightning wallet ይኽፈሎ፣ ድሕሪኡ... ፈትኖ ክሬዲት ክሳብ ምእታው።
POST https://nymbot.ai/api/v1/topup/create/btc-lightning — API key የኻበ perlu ኣሎ።
| መስክ | ጽሕፋት | ዝተሓለወ | መግለጺ |
|---|---|---|---|
amount | ቁጽሪ | እወ | ኣብ ክንደይ፣ currencyን sats ናይ ዝግበር ምሉእ ቁጽሪ። |
currency | መመዝገቢ ክልል | ኣይፋልን | SATS (እቲ መኖር ዝግጁ ዝኾነ) USD ወይ BTC. ዶላራት ብዝብጽሕ ናይ ቢትኮይን ዋጋ ይቕየሩ። |
tier | መመዝገቢ ክልል | ኣይፋልን | pro (ናይ መበገሲ) ወይ standard: ክሬዲቱ ኣብ ኣየናይ ሚዛን ክቕመጥ? |
መደበኛ ክሬዲት 10 sats ኮይኑ፡ ናይ Pro ክሬዲት ግን 100 sats እዩ፤ ብተወሳኺ ግን ዝኾነ ናይ መጠን ቦነስ ይሓዝብ።
credits እዚ فاتור (invoice) እንታይ ከም ዝጨምሮ ይብል፡፡
መልሲ
{
"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) ወይ ድርታ፣ ዝጎደለ መጠን፣ ወይ ድማ ካብቲ ዝተወሰነ ኣዕሚni ዝጸረ መጠን (amount_too_small), ላዕሊ 1,000,000 sats (amount_too_large) ወይ ከLightning wallet ተመልክቶ ዝተኸለ (amount_out_of_range). |
429 | ኣብ ሰዓትETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETETrate_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);
መተเติม ምዃኑ ምርመራ ምግባር
እቲ ኢንቮይስ ከፍሊሉled ይብልዶ ይሓትት፣ ምስ ከፍለ፣ ድማ ክሬዲት ይውስኽ። ክሬዲት ዝገብሮ እንታይ ከም ዘረጋገጸ ምርመራ እዩ፣ ስለዚ ከዲፍካ፣ እቲ ኩነታት ክኸውን ክትመረምር ኣለካ creditedድጋሚ ድሕሪኡ ምርግጋጽ ውሑስ እዩ፦ ክንደይ ግዜ እኳ እንተሓተኻ ክሬዲት ንሓደ እዋን ጥራይ እዩ ዝኣከክብ።
GET https://nymbot.ai/api/v1/topup/status/{invoice_id} — ካልተከፈለ እቲ መግለጺ (invoice) ዝገብረሉ ኣይነት (nym) ቁልፊ የድልየሉ።
status እዩ pending (ገና ኣይክፈልልን)— paid (ክፍሊት ተኸፍሉ፣ ግን ገና ኣይተኣከልን እዩ፤ ደጊሙ ኣረጋግጥ) credited (ኣብ ሚዛንካ) ወይ expired (ኣብ ግዜ ዘይተከፈሉ)። እቶም ቦታታት ባላንስ (balance) ንዝተቐረበቲ ናይቲ መበልቲ (tier) ምልኡ እዮም።
መልሲ
{
"invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
"status": "credited",
"amount_sats": 10000,
"credits": 115,
"tier": "pro",
"expires_at": null,
"balance_credits": 523.33,
"balance_sats": 52333
}
| መገላጭታ | መዓስ |
|---|---|
400 | እቲ ኣገናጺ ካብቲ ናይ create call ዝመጸ እቲ 64-char ተባሂሉ ዝተገለጸ ኣገናጺ ኣይኮነን። |
404 | ብኡ መታወቂያ ንመዘኻኸረይ (nym) ዝተሓለወ ኢንቮይስ የለን (invoice_not_found). |
cURL
curl https://nymbot.ai/api/v1/topup/status/$INVOICE_ID \
-H "Authorization: Bearer $NYMBOT_API_KEY"
Python
import os, time
import requests
headers = {"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]}
url = "https://nymbot.ai/api/v1/topup/status/" + invoice["invoice_id"]
while True:
status = requests.get(url, headers=headers).json()["status"]
if status in ("credited", "expired"):
break
time.sleep(3)
print(status)
JavaScript
const headers = { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY };
const url = "https://nymbot.ai/api/v1/topup/status/" + invoice.invoice_id;
let status;
do {
await new Promise((r) => setTimeout(r, 3000));
status = (await (await fetch(url, { headers })).json()).status;
} while (status !== "credited" && status !== "expired");
console.log(status);
ታሪኽ ምርመራታት
ኣብ ሓደ መደብ ሓደ ሕቶ፦ እንታይ ከም ዝነበረ፡ ኣየናይ ሞዴል፡ ክንደይ ቶክንታትን ክንደይ ከም ዝኸፍሉትን። ሓላፊታት ወይ መልስታት ኣይሕዙን እዮም፣ ስለዚ ኣይትመልሱን እዮም። ኣትሚልቲ ን90 መዓልታት ይሕዙ፣ እቲ ሓደስቲ ቀዳም ኮይኑ። ናይ ምድላው ገደብ ዝተሓደገ ቁልፊ ገና ታሪኽኡ ክዕብል ይኽእል እዩ።
GET https://nymbot.ai/api/v1/queries/history — API key የብረታብረትን መሕታት (API key) የጉዳይ መለዪ ቁጽሪ የሓትት፣ እቲ ባዕልኡ ዝላኸብ መሕታትን ወይ ደኣ ተመርዐት ዘይተመርመዐ ሕቶ ካብቲ ኩሉ መفاتሕ ዝርእይ ስምካ፣
| መስክ | ጽሕፋት | ዝተሓለወ | መግለጺ |
|---|---|---|---|
page | ኢንተጀር (ጥያቄ) | ኣይፋልን | መደበኛ 1፣ ብብዝሒ ኣፍላይ 1,000፤ ዝበለጸ ገጽ እዩ 400 invalid_value. |
page_count | ኢንተጀር (ጥያቄ) | ኣይፋልን | ኣብSEFA ከምነት ብመሰረት እትታወሃ ናይ ገጽ ቁጽሪ። መሰረታዊ 20፣ ዓብዪኡ ድማ 100። |
start_dateend_date | ስትሪንግ (መደብ) | ኣይፋልን | ዕለትሰዓታት ISO 8601። |
model | ስትሪንግ (መደብ) | ኣይፋልን | እዚ ሞዴል ጥራይ። |
type | ስትሪንግ (መደብ) | ኣይፋልን | chat, responses, messages, image, video, speech, transcription ወይ embedding. |
all_keys | ቦሊያን (መ好ት) | ኣይፋልን | ብቁልፊ፡ true ኩሉ ናይቲ ተመሳሳሊ ስም ቁልፍታት የጠቓልል እዩ። Default false. |
key_id | ስትሪንግ (መደብ) | ኣይፋልን | ብተመርመየ ትእዛዝ፣ ወይ ድማ ብ... all_keys=true፡ እዚ ቁልፊ ጥራይ። |
መልሲ
{
"data": [
{
"id": "q_71c4e9a0",
"timestamp": "2026-09-30T08:12:00Z",
"model": "anthropic/claude-sonnet-5",
"type": "chat",
"input_tokens": 1240,
"output_tokens": 380,
"cached_tokens": 0,
"cost_sats": 16.2,
"cost_usd": 0.01895,
"balance": "pro",
"key_id": "4f0c9a1be27d3856",
"web_search": false,
"status": "ok"
}
],
"pagination": { "page": 1, "page_count": 20, "total": 311, "total_pages": 16 }
}
cURL
curl "https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat" \
-H "Authorization: Bearer $NYMBOT_API_KEY"
Python
import os
import requests
res = requests.get(
"https://nymbot.ai/api/v1/queries/history",
headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
params={"page_count": 50, "type": "chat"},
)
for row in res.json()["data"]:
print(row["timestamp"], row["model"], row["cost_sats"])
JavaScript
const res = await fetch("https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat", {
headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
for (const row of (await res.json()).data) console.log(row.timestamp, row.model, row.cost_sats);
መቓልባት ናይ ሒሳብ ምፍራም ሕቶታት
ቁልባት ምፍጣር፣ ምትክታን ሙሰሳን፣ ናይ ኣካውንት መጠቃለሊን ኣውቶማቲክ መተเติมታን API ቁልፍ ኣይጥቀሙን እዮም። ካብቲ 'nym'ኩም ዝመጸ ቅጥዓት (signature) እዮም ዝውስዱ፣ ስለዚ ዝለቀቕ ቁልፍ ክሳብቲ ዝወሰኖ ወሰን ክኸፍል ይኽእል እኳ እንተኾነ፣ ካልእ ቁልፍ ክፈጥር ወይ ድማ ርእሱ ወሰን ክውስኽ ኣይክእልን እዩ።
እቲ መተግበሪ እዚ ንዓኻ ይገብረልካ እዩ፦ ኩሉ ነገር ኣብ... API sheet እዞም ነዞም endpoints ይጥቀመ ኣሎ። ካብዚ ናትካ ኮድ ቁልፎታት (keys) ንምምሕዳር እዚ ክፋል ጥራይ እዩ ዘድልየካ።
እቲ ኣተሓባይነት (signature) ዓይነት 27235 (NIP-98) ዘሎ Nostr event እዩ፣ ብመሰረት base64-encoded ዝተላኽአ ኣብቲ
Authorization ብዝቃል ዝተሰርሐ መበገሲ ርእስቲ Nostr ኣብ ቅድሚ:
እቲ ክስተት
{
"kind": 27235,
"created_at": 1790726400,
"tags": [
["u", "https://nymbot.ai/api/v1/keys"],
["method", "POST"],
["nonce", "9c4e21f07a3b...16 random bytes in hex"],
["payload", "3f1a0d7c8e2b...sha256 of the exact request body in hex"]
],
"content": "",
"pubkey": "your public key in hex",
"id": "...",
"sig": "..."
}
uእቲ ሙሉ URL እቲ ሕቶ፣ inquiry string (query string) ኣብርሂ፣ ከምቲ እተሰlact ዝተላኽአ ብልክዕ እዩ።methodእቲ HTTP ሜቶድ እዩ።payloadእቲ ናይቲ ጥሬ ናይሓደ ሕቶ (raw request body) SHA-256 ብሄክሳደሲማል (hex) እዩ። ኣብ ... ዘድሊ እዩPOSTእናPATCH፣ ከኡሞት ዝሰድዶ እቲ ናይ ኣካል (body) ብባይት ብባይት እቲ ዘተመሃምምክ (hashed) እዩ ክኸውን ኣለዮ።created_atካብ ሰርቨር ሰዓት ኣብ ውሰን 60 ሰከንድ ክኸውን ኣለዎ።- ኩሉ ኩነት ሓደ እዋን ጥራይ ይሰርሕ፣ እ
GETእተሓሒዙ፣ ስለዚ ዝተሓዘ header ዳግማይ ክቕርብ (replayed) ኣይክእልን እዩ። ንሎሚ ዝሓተትካዮ ሓደ መደብ (request) ንኡስ ምልክት (Sign) ኣዳልው። ወስኽnonceብናይ ምናልባት ዝተመሓለወ ዋጋ ምልክት (tag) ክትገብሮ፣ ከምኡ ድማ ኣብቲ ተመሳሳሊ ሰከንድ ዝተሰርሑ ክልተ ሕቶታት (requests) ክፈላለዩ። - ተመርዛዊ ሕቶ (signed request) አካል ጌቶ 64 KB ክኸውን ይኽእል እዩ፣ እቲ አካል ድማ የድሊ እዩ
Content-Type: application/json.
ዝጠፍተ ክንうちに ዝመልከቱ 401 missing_nostr_auth; ኣዘቤናኡ ዝተሓጐሰ፣ ኣግባብ ዘይተሰርሐ፣ ኣግባብ ዘይተሓተተ፣ ኣዝዩ ጥንታዊ፣ ወይ ድማ ንዝተፈላለየ URL፣ ሜቶድ ወይ body ዝምልከት ይመለስ
invalid_nostr_authብመልእኽቲኡ ዘሎ ምኽንያት፡ ዝተጠቐምሉ ዳግማይ ይመለስ
nostr_auth_replayedናብዚኦም ነጥብታት ዝተላከዐ API key ክቐበሎ ኣይክእልን እዩ። ቅድሚ እቲ body ምቕራብ፣ እቲ signature ይርከብ፣ እሞ ነፍሲ ወከፍ ኣድራሻ ኣብ ሰብዓተ ደቒቕ 30 ግዜ ክቅበል ይኽእል እዩ (ሓደ IPv6 ኣድራሻ ከም ድልዱሉ /64 ይቆጸር)፤ ድሕሪኡ ድማ... 429 ብ bersama with
Retry-After.
ብ্ৰውዘራት (Browsers) እዞም ኣጠቓቕማታት (endpoints) ካብቲ ናይ Nymbot ርእሰይቲ ጣውታት ጥራይ እዮም ክጽውዑን ዝኽእሉ (https://nymbot.ai,
https://nymchat.app ኣብቲ ዝተፈልየ ሰበል ዝመሓላለፍኩሎም ሰብ-ዶሜይን (subdomains)። ኣብ ዝኾነ ካልእ ሳይት ዘሎ ገጽ፡ ዝተኣማኒነት መሪሕቲ (CORS headers) ኣይመጽሉን ስለ እተኸውን፡ እቲ ዝመልሱሉ ነገር ክቕርብ ኣይክእልን እዩ። ስክሪፕትታትን ናይቲ ስርዓተ-ቁጥጥር ኣፍሊጦም ዘለዉ ኣፕሊኬሽንታትን (native apps)፡ ዘይሰንትኩዎም...
Origin, ኣይተጎዲኦምን።
ተፈራሚነት ናይቲ nym ምስጢራዊ ቁልፊ (the) የጠይቕ ኣሎ nsec), እቲ ኩሉ ዝሕራዝ፡ መንነትኻ፣ ታሪኽካን ሚዛንካን ዝቁጻጽር። ኣብ ዝተኣመንካ መሽን ኣብ ስክሪፕት ጥራይ ኣቐምጦ፣ ኣብ ፋይል ክትጽሕፎ ከለኻ ካብቲ environment (መመላኽቲ ኣካባብነት) ኣንብቦ፣ ከምኡ እውን ክትኽእል ከለኻ ነቲ ኣፕ (app) ኣፍቐልዎ።
እዞም ረቛሒታት እዚኣቶም እቲ ርእስቲ (header) ይገብሩ። ኣብዚ ገጽ ዘለዉ ሎሚ ዝመጹ ኣብነታት ይጥቀሙሉmod። እዞም እዞም ምስቲ ምስጢራዊ መራጊ (secret key) ኣብ hex መልክዕ ካብ እቲ ኣንብብዮ... NOSTR_SECRET_HEX; እቲ ናይ cURL ዝኾነ እቲ...
ደለየ command-line tool, እቲ nsec ወይ hex
key ዝቕበል፣ ከምኡ እውን sha256sum (ኣብ macOS, shasum -a 256).
cURL
nostr_auth() {
method="$1"; url="$2"; body="$3"
nonce=$(openssl rand -hex 16)
if [ -n "$body" ]; then
hash=$(printf '%s' "$body" | sha256sum | cut -d' ' -f1)
event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce" -t "payload=$hash")
else
event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce")
fi
printf 'Nostr %s' "$(printf '%s' "$event" | base64 | tr -d '\n')"
}
Python
# pip install coincurve requests
import base64, hashlib, json, os, time
from coincurve import PrivateKey, PublicKeyXOnly
SECRET = bytes.fromhex(os.environ["NOSTR_SECRET_HEX"])
def nostr_auth(method, url, body=b""):
pubkey = PublicKeyXOnly.from_secret(SECRET).format().hex()
tags = [["u", url], ["method", method], ["nonce", os.urandom(16).hex()]]
if body:
tags.append(["payload", hashlib.sha256(body).hexdigest()])
created_at = int(time.time())
serialized = json.dumps([0, pubkey, created_at, 27235, tags, ""], separators=(",", ":"), ensure_ascii=False)
event_id = hashlib.sha256(serialized.encode()).digest()
event = {
"id": event_id.hex(),
"pubkey": pubkey,
"created_at": created_at,
"kind": 27235,
"tags": tags,
"content": "",
"sig": PrivateKey(SECRET).sign_schnorr(event_id).hex(),
}
return "Nostr " + base64.b64encode(json.dumps(event).encode()).decode()
JavaScript
// npm install nostr-tools
import { createHash, randomBytes } from "node:crypto";
import { finalizeEvent } from "nostr-tools/pure";
const secret = Buffer.from(process.env.NOSTR_SECRET_HEX, "hex");
export function nostrAuth(method, url, body = "") {
const tags = [["u", url], ["method", method], ["nonce", randomBytes(16).toString("hex")]];
if (body) tags.push(["payload", createHash("sha256").update(body).digest("hex")]);
const event = finalizeEvent(
{ kind: 27235, created_at: Math.floor(Date.now() / 1000), tags, content: "" },
secret,
);
return "Nostr " + Buffer.from(JSON.stringify(event)).toString("base64");
}
መጠቃለሊ እቲ ሒሳብ
ኣብቲ ናይቲ ኣፕሊኬሽን API ሸት ኣብ ላዕሊ ዘርእዮ፡ ናይቲ ዓብየኻ ቁልፊ (public key)፣ ክልቲኦም ሚዛናት፣ ክንደይ ቁልፍታት
እንተመደበዩ (ዝተሰረዙ ወይ ውልቀዮም ዘይኮኑ)፣ ከምኡ እውን... ኣውቶማቲክ ኣገማጽቲ ሒደት (automatic top-up) ኣৱድታት፣ ወይስ
null ሰርቨርቲ ንሳቶም ከይቐረበሎም።
GET https://nymbot.ai/api/v1/account — ይደልየ ተመርዐት ዘይተመርመዐ ሕቶ.
መልሲ
{
"data": {
"pubkey": "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
"balances": {
"standard": { "credits": 120.4, "sats": 1204 },
"pro": { "credits": 408.33, "sats": 40833 }
},
"keys_active": 3,
"nwc_auto_topup": {
"connected": true, "threshold_sats": 5000, "topup_sats": 20000, "tier": "pro",
"last_topup_at": null, "last_topup_sats": null, "last_error": null
}
}
}
cURL
URL=https://nymbot.ai/api/v1/account
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/account"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/account";
const res = await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } });
console.log(await res.json());
መፍቻታት ምሕዳር
ኣብቲ ናይቲ መተግበሪ መደብ መደብ ቁልፍታትን ጀርባ ዘለዉ ናይ መወዳደፊታ ነጥብታት (endpoints)። ኩሎም ኣገደስቲ እዮም ተሓትቲ መጠይቕከእዚ ቅርጺ ዝወጽእ እዩ ኩሉ ቁልፊ፣ እቲ ግዜ ብ 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 | ቦሊያን (መ好ት) | ኣይፋልን | ዝተወገዱ መፍቶታት (keys) ኣ incluyen። መደብ (Default) false. |
መልሲ
{ "data": [ { "id": "4f0c9a1be27d3856", "name": "laptop scripts", "hint": "sk-nymbot-Qm7x…c2Lw", "...": "..." } ] }
cURL
URL=https://nymbot.ai/api/v1/keys
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys"
for key in requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"]:
print(key["id"], key["name"], key["period_used_sats"], key["limit_sats"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys";
const { data } = await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json();
for (const key of data) console.log(key.id, key.name, key.period_used_sats, key.limit_sats);
መራኸት ምግባር
POST https://nymbot.ai/api/v1/keys — ተፈረመ። መመለሲታት 201.
| መስክ | ጽሕፋት | ዝተሓለወ | መግለጺ |
|---|---|---|---|
name | መመዝገቢ ክልል | እወ | 1 ክሳብ 40 ኣበይቲ ፊደላት፣ ካብቶም ካልኦት ንጥፈት ዘለዎም ቁልፋትካ ዝተፈልየ (ብዘይ ግምት ዓቢ ወይ ንኣሽቱ ፊደላት)። |
limit_sats | መሓዋሪ ቁጽሪ | ኣይፋልን | ወሰን ዘፍቃ ሂሳብ ብሰትስ (sats)፣ ቢያንስ 1። ንኣቐላለሊ ድማ ባዶ Leave it። |
reset_period | መመዝገቢ ክልል | ኣይፋልን | daily, weekly ወይ monthly። ፍላጎታት limit_satsዝያተ ምሉእ ዘይተሓዝበ ሓደ ናይ መቐየሪ ሓዋን (cap) ንምባል ጥራይ ተሓዊኡ ሓዲጉ። |
expire_at | ስትሪንግ ወይስ ኢንተጀር | ኣይፋልን | እቲ መትሓKey ምስ ሰናበ: ISO 8601 ግዜ፣ ወይ ድማ ካብ 1970 እተረፈ ሚልliseconds። |
ምላሽ (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); ቢያንስ ሓደ ዝኾነ ሓደ ሙሉ ቁጽሪ ዘይኮነ ገደብ፤ ሓደ ገደብ ዘይብሉ ናይ ዳግማይ ምጅማር ግዜ፤ ዝሓለፈ ናይ ምልዓል ግዜ፤ ዘይተፈልጥ ምሉእነት (unknown_parameter); ወይ ድኹን 25 ንጥፈት ዘለዎም ቁልፍታት ድሮ (too_many_keys). |
429 | ኣብ ሰዓት ከምዚ ዝበለ ስም ዝተሰርሑ 60 ንላዕሊ ቁልፍታት፣ ወይ ካብዚ ኣድራሻ 120 (rate_limit_exceeded, ምሳ Retry-After). |
cURL
URL=https://nymbot.ai/api/v1/keys
BODY='{"name":"laptop scripts","limit_sats":20000,"reset_period":"monthly"}'
curl "$URL" \
-H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json
import requests
url = "https://nymbot.ai/api/v1/keys"
body = json.dumps({"name": "laptop scripts", "limit_sats": 20000, "reset_period": "monthly"}).encode()
res = requests.post(
url,
data=body,
headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"]["key"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys";
const body = JSON.stringify({ name: "laptop scripts", limit_sats: 20000, reset_period: "monthly" });
const res = await fetch(url, {
method: "POST",
headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
body,
});
console.log((await res.json()).data.key);
ሓንቲ ቁልፊ ምንባእ
GET https://nymbot.ai/api/v1/keys/{id} — ተፈረመ።
መልስታት {"data": {…}} ብመኽሪ ዕቃ፣ ወይ ድኣ 404
key_not_found ከንስኻ ኣለኹም ዝተባheld ቁልፍ እዚ መለያ (id) እንተዘይብሉ፡፡
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
console.log((await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json()).data);
መፍታሕ ምስቅያየር
PATCH https://nymbot.ai/api/v1/keys/{id} — ተፈረመ።
ከነቲኦም ዝኾነ ክሰደድ name, limit_sats, reset_period እና
expire_atከመፍጠኒት ቀደም ዝያ ብተጠቐምኩሎም ሕጊታት ተመሳሳሊ፣ null ሓደ ዓውደ ክጽረ እዩ፦ ገደብ የብሉን፣ ምሶሶ የብሉን፣ ናይ ግዜ መወዳእታ የብሉን። እቲ ናይ ምሶሶ ግዜ ምቕያር ሓድሽ ግዜ ካብ ዜሮ ክጅምር እዩ። ዝተሰረዘ መደብ (key) ክቕየር ኣይክእልን (400 key_revoked). ይመልስ
{"data": {…}} ብተሓደሰ እቲ ቁልፊ ኣፍላጦ (key object)።
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
BODY='{"limit_sats":50000,"expire_at":null}'
curl -X PATCH "$URL" \
-H "Authorization: $(nostr_auth PATCH "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
body = json.dumps({"limit_sats": 50000, "expire_at": None}).encode()
res = requests.patch(
url,
data=body,
headers={"Authorization": nostr_auth("PATCH", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"])
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const body = JSON.stringify({ limit_sats: 50000, expire_at: null });
const res = await fetch(url, {
method: "PATCH",
headers: { "Authorization": nostrAuth("PATCH", url, body), "Content-Type": "application/json" },
body,
});
console.log((await res.json()).data);
ቁልፊ ሻጋገርቲ
DELETE https://nymbot.ai/api/v1/keys/{id} — ተፈረመ።
ቁልፊ ብቕጽበት፣ ንዘለዓለም ይኣክል።
ኣብቲ ዝርዝር ምስ... ይቕጽል:: revoked_at ዝተተሓሰበ፣ ከምኡውን
ብመሰኻ ክርአ ይኽእል እዩ include_revoked=trueቀደም ብሉ ዝተሰረዘ ቁልፊ ብምስረዝ እውን ተመሳሳሊ መልሲ ይሃብ። እቶም 50 ዝሓዱሳት ዝተሰረዙ ቁልፍታት ጥራይ ይሕዙ፤ ሓደ ካልእ ቁልፊ ምስ ተሰረዘ፡ እቶም ጥንታውያን ይሰርዙ።
መልሲ
{ "data": { "id": "4f0c9a1be27d3856", "revoked": true } }
cURL
URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());
NWC ኣውቶ-ቶፕ-ኣፕ
Lightning wallet ምስ Nostr Wallet Connect ኣተሓባብዮ፡ Nymbot ድማ ቅጥሚ (balance) ብ API ምጽዋት ምስ ዝቕንስ ብባህላዊ ኣገባብ ክመልኦ እዩ። ናይቲ ኣፕሊኬሽን API ሰነድ ተመሳሳሊ ኣৱድታት ኣለዎም፤ እዚኣ ድማ እቶም ኣብ ጀርባ ዘለዉ ርክባት (endpoints) እዮም። ኩሎም ኣድነት ኣለዎም ተመርዐት ዘይተመርመዐ ሕቶ.
ከመረጥካዮም ሚዛን (balance) ድሕሪ ናይ API ሕቶ ክፍሊት ምስ ተገብረ፡ እቲ ሚዛን ካብቲ ዝወሰንካዮ ዝቅታዊ መጠን (threshold) ዝጸረ ከሎ፡ Nymbot ንዝተሓደሰቲ መጠን ክፍሊት فات breached (invoice) ይሠርሕ፡ ንጃ錢 (wallet) ክኸፍል ይሓትት፡ ከምኡ ድማ እቲ ክሬዲት ይውስኽ። ንነፍሲ ወከፍ nym ከምኡውን ሚዛን ኣብ ሓደ 5 ደቒቕታት ኣብ ሓደ ግዜ እቲ ዝበዝሕ ክሳብ ክትቅይር ስለ ዝኽእል፡ ናይ ሕቶታት ብርቱዕ ክምላኽ ዝኽእል ኣይኮነን። ኣብ ኣፕሊኬሽንታት ዝፍጸም ምውጻኢ (spending) ነዚ ተግባር እዚ ኣይውስኽን እዩ። እቲ ግዜን መጠንን ናይቲ ናይጊዲ ክፍሊት፡ ከምኡውን ናይቲ ናይጊዲ ስሕታ (error) ኣብ ኣተሓባባይ (settings) ይርከብ፤ እቲ ክፍሊት ድሕሪ ስሕታ እንተተገብረ፡ እቲ فات breached ምስ... እቲ ኩታ ብዛዕባ ኩታ መበልተታዊ ሓ状 ክሬዲት ይቕጽሎ።
ናይ ኮኔክሽን ስትሪንግ (connection string) ዝሓዘ ኮï ንወለትካ (wallet) ክኸፍል ክሓትት ይኽእል እዩ። Nymbot ብጥንቃቐ ተሓዲሱ (encrypted) ይሕዝዎ እዩ፡ ከምኡ እውን ንብዝራብ መክፈሊያ (top-up invoices) ጥራይ እዩ ዝጥቀመሉ፤ ግን ንዚ ዓላማ ጥራይ ዝተመርቀሰ፣ ኣብ ውሉኻ ዘሎ ናይ ምቕያር በጀት (spending budget) ዘለዎ ኮኔክሽን ክትፈጥር ትኽእል ኢኻ፡ ስለዚ ዝከፍሎ ዝສንዐ ቁጽሪ ንስኻ ዝመረጽካዮ ጥራይ ክኸውን እዩ። እቲ ወለት (wallet) ክደግፎ ኣለዎ pay_invoice.
ወሰን (wallet) ምትሓ verbunden ምግባር
POST https://nymbot.ai/api/v1/nwc-auto-topup/connect — ተፈረመ።
| መስክ | ጽሕፋት | ዝተሓለወ | መግለጺ |
|---|---|---|---|
nwc_url | መመዝገቢ ክልል | እወ | እቲ ናይ ምትእስሳሪ መስመር፣ ዝጅምር nostr+walletconnect://. Nymbot ንዎለቲ ይሓትት get_info ቅድሚ ምሁሩ፣ ብመሓሓፍ ድማ ይሓዝዎ። |
threshold_sats | መሓዋሪ ቁጽሪ | እወ | መጠይቕ እሞክእ ከይዓረፈ እዚ ዝስዕብ ዝብል ቁጽሪ ሳትሺ (sats) እንተወሪዱ። ቢያንስ 1,000። |
topup_sats | መሓዋሪ ቁጽሪ | እወ | መዓስቲ መዓስቲ ክትውስኽ ኣለኻ? ካብ 1,000 ክሳብ 1,000,000 sats። |
tier | መመዝገቢ ክልል | ኣይፋልን | pro (ናይ መበገሲ) ወይ standard: ቀሪ ሂሳብ ንክትትልን ንምቕያርን። |
መልሲ
{
"data": {
"connected": true,
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
"last_topup_at": null,
"last_topup_sats": null,
"last_error": null
}
}
| መገላጭታ | መዓስ |
|---|---|
400 | ናይ ምትእስሳሪ መስመር ኣይኮነን (invalid_nwc_url); መሰኻፊኡ ብሬሌይኡ መልሲ ኣይሃበን (nwc_unreachable) ወይ ድሕሪኡ ነቲ ቼክ ኣተወርዐ (nwc_rejected); እቲ ዝተኣhiየ (connection) ፋክቱራታት ክኸፍል ኣይክእልን እዩ (nwc_missing_permission); ወይ ድሕሪቲ ካብቲ ውሱንታ ወጻኢ ዝኾነ መጠን። |
501 | ኣብዚ ሰርቨር እዚ ኣውቶማቲክ ኣተኣታውቲ (top-ups) ኣይተሰሪሑን (nwc_unavailable). እቲ ተመሳሳሊ ነገር ንነቶም ክልተ ካልኦት ኤንድፖይንትታት እውን ተፈጻሚ እዩ። |
cURL
URL=https://nymbot.ai/api/v1/nwc-auto-topup/connect
BODY='{"nwc_url":"nostr+walletconnect://...","threshold_sats":5000,"topup_sats":20000,"tier":"pro"}'
curl "$URL" \
-H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
-H "Content-Type: application/json" \
-d "$BODY"
Python
import json, os
import requests
url = "https://nymbot.ai/api/v1/nwc-auto-topup/connect"
body = json.dumps({
"nwc_url": os.environ["NWC_URL"],
"threshold_sats": 5000,
"topup_sats": 20000,
"tier": "pro",
}).encode()
res = requests.post(
url,
data=body,
headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json())
JavaScript
const url = "https://nymbot.ai/api/v1/nwc-auto-topup/connect";
const body = JSON.stringify({
nwc_url: process.env.NWC_URL,
threshold_sats: 5000,
topup_sats: 20000,
tier: "pro",
});
const res = await fetch(url, {
method: "POST",
headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
body,
});
console.log(await res.json());
ኣሰራርሓታት ክርአ ኣሎ
GET https://nymbot.ai/api/v1/nwc-auto-topup — ተፈረመ።
ከመገናናዕ (connecting) ምስ ዝተኣሳሰር ተመሳሳሊ ኣፋንታታትት ይመልስ፣ ምስ connected: false ወን ኣከለ እቶም ካልኦት ዓዲታት
null ዝያለ ወለት (wallet) ዝተኣቢኑ ከሎ። ናይ ምትእስሳር 字符串 (connection string) ባዕሉ ፈቀሚ ኣይቐርብን እዩ።
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 — ተፈረመ።
ዝተሓዝበ ኮኔክሽን ስትሪንግ (connection string) የወ�ድ ኣየ። ዝተሓዘ መወከሲ ገንዘብ (top-ups) ድማ ኣይግበርን እዩ። ንላዕሊ ንምርግጋጽ፣ ኣብ ዎሌትኩም ነቲ ኮኔክሽን ክትሰርዝ (revoke) ትኽእሉ ኢኹም።
መልሲ
{ "data": { "connected": false, "threshold_sats": null, "topup_sats": null, "tier": null, "last_topup_at": null, "last_topup_sats": null, "last_error": null } }
cURL
URL=https://nymbot.ai/api/v1/nwc-auto-topup/connection
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"
Python
import requests
url = "https://nymbot.ai/api/v1/nwc-auto-topup/connection"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())
JavaScript
const url = "https://nymbot.ai/api/v1/nwc-auto-topup/connection";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());
ኣኑ без key ብመሰረት ዝተሓተተ (request) ክፍሊት ምግባር
ዝተወሰነ ዋጋ ዘለዎም መወዳደብታታት ብLightning፡ ብሓደ ሓደ ጥቓስ ክኽፈሉ ይኽእሉ እዮም፡ ብዘይ ቁልፍ፣
ብዘይ ኣካውንት ከምኡ’ውን ብዘይ ተረፈ ዋጋ፦ POST /images/generations, POST /images/edits,
POST /videos, POST /audio/speech, POST /audio/transcriptions,
POST /audio/translations እና POST /embeddings. Chat, Responses ከ
Messages ኩሉ እቲኣ ቁልፊ (key) የድखየ። ቁልፊ ዘለዎ ሕቶ ከም መደብ ብቀይር ቀሪት (balance) ይፍጸም፤ እቲ ክፍሊት ዝጅምር ግን ቁልፊ ምስ ዘይተላኽተ ጥራይ እዩ።
Nymbot ካለቲEtwo backend፡ ሓደ ሓሳብ ብክልተ ኣገባብ ይዛረብ፦ Lightning Labs'
L402 (ብቀዳማይ ስሙ እውን ተቐቢሉ፣ LSAT) ከIETF ድፍታ (draft) ምስ
ክፍሊት ብHTTP ኣተሓባይነት መደብ ምስቲ lightning ኣገባብን
charge ምግባር። ዓሚልካ ዝርድኦ ዝኾነ ኣላቱ ተጠቐም።
ከመፍቻ (key) ዘይተጥለየ ክፍሊት ክትከውን ዝኽእልte እንታይ ምስ ዝኸውን ጥራይ እዩ API_L402_SECRET ቢያንስ 32 random bytes (ከhex (64 ፊደላት) ወይ ከbase64 (44)) ይሓዝ። ብ... ተጠቂምካ ሓደ ስራዕ ስራዕ። openssl rand -hex 32ኣጭር ወይ ክመሓሰ ዝኽእል ዋጋ እቲ ባህሪ ናብ ምቁሚ ይቕይሮ ከምኡ እውን ስለምንታይ ከም ዝተቆም ከምኡ ይጽሕፍ። ንምቕያር ግን፡ እቲ ጥንታይ ዋጋ ናብ ከተቴ ክት déplacer ክትገብሮ ኣለካ። API_L402_SECRET_PREVIOUS ንሓደ መዓልቲ፦ ኣፍላፊናታት (credentials)፣ ኣድራሻታት ኩነታት (status URLs) ከምኡ እውን ኣብ ትሕቲኡ ዝተገብሩ ጸገማት (challenges) ክሳብ እዋን ናይ ምብላሕቶም ክሰርሑ ይቕጽሉ ኣለዉ።
እቲ ተግዳሮ
እቲ ሕቶ ብዘይተሓያለ Addት ስደደዮ Authorization ርእስ። ተቐባልነት እንተሃልዩዎ፣ ዝኾነ ነገር ኣይሰርሕን፣ ከምኡ እውን
ትረክብ 402 Payment Required ንቲ ሕቶ ዝኸውን ትርወቶ ብትክክለኛ ዋጋ ተኣቢዩ፡
እቲ መሪ (key) ዝኽፍሎ ተመሳሳሊ ዋጋ፡ ብ 10 sats ንሓደ መደበኛ ክሬዲት ወይ ብ 100 sats ንሓደ Pro ክሬዲት ተቐይሩ
ወይ ድማ ናብ ሙሉ sat ተሓrounding ተገይሩ (ቢያንስ 1 sat፣ ከምኡ እውን ቢያንስ እቲ 0.05 ክሬዲት ዝተወሰነ ኣዕMinima)። እቲ
ምላሲ ሰለስተ ይሓዘ 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 ፓৰາມለተር (parameter) እዩ base64url JSON:
{"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.
ሓደ ተግዳሮ ምስቲ መወዳእታ ተኣጣጢፉ ኣሎ፣ ናብቲ Content-Type (ዓይነት ሚዲያኡን፣ ንmultipart ድማ ድንበርኡን) ከምኡውን ንኣብነት ዝተሰደዱ ናይ ኣካልነት ባይትታት (body bytes) SHA-256 ምስ ዝተኣናጸረ፣ ን15 ደቓይቀ ይጸንሕ። ብከፈሊ (paying) ድሕሪ ምፍጻም፣ እቲ ሰደዶ... ተመሳሳሊ ዳግሚ ሕቶ፡ ከኣ ምስቲ ዝቐደመ
Content-Type ከኡ ተመሳሳሊ JSON ባይትታት፣ ወይ ድማ ንማ/images/edits, /audio/transcriptions, /audio/translations)
ንተከታታሊ ኣካል ዘለዎ እቲ ሓደ body ምስ ተመሳሳሊ boundary። ዝለዓለ ብዙሓት HTTP libraries ቅጥዒ (form) ክመዝገቡ ከለዉ ሓድሽ boundary ይመርጹ፡ ስለዚ ሓደ ግዜ ጥራይ መዝገቦ እቶም bytes ክትሰድዶ።
ነፍሲ ወከፍ ኣድራሻ ኣብ ሓደ ደቒቕ 30 ፈተናታት ክሓትት ይኽእል እዩ (IPv6 ኣድራሻ ከም ናይኡ ምሉእ /64 ይቆጠር)።
ኣድራሻኦም ዘይተፈልጥ ኣድራሻታት ዘለዎም ሕቶታት ዝበለጸ መገዲ ተኸታተሊ 10 ኣብ ሓደ ደቒቕ ጥራይ ክቐበሉ እዮም፣ ከምኡ እውን Nymbot ኣብ ኩሎም ኣድራሻታት ዝቕርቦም ፈተናታት ዓቢ ገደብ ኣላ፤ ሓደ ፈተና ቅድሚ ምግባሩ ዝተመነዘረ ሕቶ (ንኣብነት ብመሰል JSON ዘይተኸታተለ ኣካል ዘለዎ) ናብቲ ገደብ ኣይኣጠቓቕሙ እዩ። ካብኡ ንላዕሊ መልሲኡ እዩ 429 ብ bersama with Retry-After፣ ነቲ አካል ቅንባር ቅድሚ ምፍታሕ ዝተላእከ። ብመኽሪ ወይ መታወቂያዘይ ዝተCall ዝተገብሩ መወዳእታታት እውን፡ ብሓደ ኣድራሻ ኣብ ሓደ ደቒቕ ዘሎ ናይ 120 ዘይተመዝገቡ ሕቶታት ኣጠቃላይ ገደብ ይውስኽ። መታወቂያ ነቲ አካል ቅንባር ቅድሚ ምፍታሕ ይርከብ፣ እቲ ድማ ሕቶ ዘለዎ Content-Type ኣይኮነን application/json (ወ]
multipart/form-data ንተወውድ (uploads) ብረፍተይ ይኸውን 415 ንኣብነት ድማ ኣይርከብን
ኢንቮይስ።
ኤምቤዲings (Embeddings) ዋጋ ዝውሃድ ብኣረዳእታ ብኣብነት ተወሳኺ ቶከንስ (tokens) ካብቲ ዝኣተወ ጽሑፍ ብ1.5ታሕላው ዝተሓሰበ ይመለከት፣ ምኽንያቱ ናይቲ ናይብዓርባይ ቁጽሪ ዝፍለጥ ድሕሪ ምFinish ምግባር ጥራይ ስለዝኾነ። ንእዤምቶም ዝተጠቐምኩሎም ቶከንስ ጥራይ ትኸፍል፣ ዘይተጠቐምክሎም ክፍሊ ድማ ከም... ይመለሰልካ። መመለሲ Token (refund token).
ክፍሊት ምእታው
ብዝኾነ ናይ Lightning wallet ኢንቮይስ ክፈልጥ። እቲ wallet እቲ preimage (64 ናይ hex ፊደላት) ይህልካ እዩ። ድሕሪኡ ነዚ ተመሳሳሊ ሕቶ ካብ እዞም ዝስዕቡ ብነተይ ተላክ፦
| እቅድ | ኣርእስቲ |
|---|---|
| L402 | Authorization: L402 <macaroon>:<preimage> (LSAT ከው ኣብled ይሰርዕ እውን) |
| ክፍሊት | Authorization: Payment <base64url JSON>፣ JSON ኣሎ ዘለዎ ኣበይ እዩ? {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}} |
ብክፍሊት ዝግበር ሕቶ፣ ብመክፈቲ ዝተገብረ ሕቶ ብልክዕ ይመልስ፣ እንተ ግን እቲ nymbot
ኣብቲ ኦብጀክት (object) ናይ ቁጽሪ መተወዓታይ (balance) ቦታታት የብሉን፦ {"payment": "l402", "tier": "pro", "paid_sats": 237,
"charged_sats": 237}፣ ከኡ ድኣ ኣይህልውን እዩ X-Nymbot-Balance-Sats ርእስ። ብዕቅድ ክፍሊት ዝተከፈለን መመለሲ ድማ ... ይረክብ። Payment-Receipt header (base64url
JSON ምስቲ መለክቲ መታወቂያ (challenge id)፣ ምስቲ ክፍሊት ሃሽ (payment hash) ከም reference, status እና
timestamp). ዝተከፈሉ ሕቶታት ምስ ዝኾነ nym ኣይተኣሳሰሩን፣ ስለዚ ኣብ ታሪኽ ሕቶታት ኣይትረኣይን እዮም።
| መገላጭታ | መዓስ |
|---|---|
402 payment_already_used | ኩሉ ክፍሊት ንሓደ ሕቶ ይኽፍል። እቲ መልሲ ንዘዚታ ሕቶ ሓድሽ ፈታኒ እዩ፣ ስለዚ ዓሚልቲ ድሕሪት ዘSAVE ዝገብሮ ኣታውታው (ክሳብ lnget ይፍጽም) ብቐሊሉ ዳግሚ ይከፍል። |
402 payment_mismatch | እቲ መረጋገጺ ንኻልእ መወዳእታ ተздаሂቡ እዩ፣ Content-Type ወይ ንኣካል፡ ወይ ካብዚ ሕቶ እዚ ዝጸረት ክፍሊት ሕጂ ዋጋ ይኸውን። ሓድሽ ተግዳሮ ንእዚ ሕቶ እዚ ምስኡ ይመጽእ፤ እቲ ክፍሊት ኣዝዩ ጸቢድ እንተኾይኑ፡ እቲ ዝኸፈልካ ይመለሰካ፡ መመለሲ Token (refund token) (refund_token እና refund_sats ኣብቲ ኣካል)። |
402 payment_expired | ካብቲ ተግዳሮት ሓደ 15 ካብ ዝበለጠ ደቒቕትታት ነጊሱ። ሓድሽ ተግዳሮት ምስኡ ይመጽእ ኣሎ። እቲ preimage ክትኽፈል ከም ዝከፈል ምስ ኣሳይዓካ፣ ክትክፈሎ ዘለኻ ነገር ከም --- ይመለሰልካ። መመለሲ Token (refund token) (refund_token እና refund_sats ኣብቲ ኣካል)፣ ሓደ፤ እቲ መረጋገጺ ድሕሪኡ ክጥቀመሉ ይኸውን። |
401 invalid_preimage | እቲ ፕሮኢሚጅ ናብ ናይ እታ ኢንቮይስ ክፍሊት ሃሽ ኣይሃሽ ይኸውን ኣይዘይብን። ክፍሊቱ ኣይተጠቐመሉን። |
401 invalid_payment_credential | እቲ መታወቂያ (credential) ሕጊ ኣይሰራምዱን፣ Nymbot ከም ዝሃቦ ድሕሪኡ ተቐይሩ፣ ወይ ድማ Nymbot ንዘይሰርሖ ክፍሊት (payment hash) ዘመለክት እዩ። Nymbot ዘይፈልጦ ቅድመ-শর্ত (caveat) ዘለዎ፣ ወይ ድማ ተቓራኒ ቅድመ-शর্তታት ዘለዎ ማካሩን (macaroon) ክቐበሎ ኣይፍቀድን እዩ። |
429 rate_limit_exceeded | ካብዚ ኣድራሻ ኣብ ውሽጢ ደቒቕ ዝያዳ ካብ 30 ምስ ዘይተመዝገቡ መታወቂያታት ወይ ቁልፍታት ዝመጹ፣ ወይ ድማ ሓደ ናይ ምልካክ (refund) ቶከን ኣብ ውሽጢ ደቒቕ ብዝያዳ ካብ 60 ግዜ እንተተላክዩ። ተጸበየ፦ Retry-After. |
cURL
BODY='{"model":"nano-banana","prompt":"a lighthouse at dusk","response_format":"b64_json"}'
URL=https://nymbot.ai/api/v1/images/generations
# 1. Get the challenge
CH=$(curl -s -D - -o /dev/null "$URL" -H "Content-Type: application/json" -d "$BODY" | grep -i '^www-authenticate: L402')
MAC=$(echo "$CH" | sed -E 's/.*macaroon="([^"]+)".*/\1/')
INVOICE=$(echo "$CH" | sed -E 's/.*invoice="([^"]+)".*/\1/')
# 2. Pay $INVOICE with your wallet and copy the preimage
PREIMAGE=...
# 3. Send the identical request with the credential
curl "$URL" -H "Content-Type: application/json" -H "Authorization: L402 $MAC:$PREIMAGE" -d "$BODY"
lnget
# lnget (Lightning Labs) pays L402 challenges from your own lnd node and retries for you
lnget -X POST -H "Content-Type: application/json" \
-d '{"model":"nano-banana","prompt":"a lighthouse at dusk","response_format":"b64_json"}' \
https://nymbot.ai/api/v1/images/generations
Python
import base64, json, re
import requests
url = "https://nymbot.ai/api/v1/images/generations"
body = json.dumps({"model": "nano-banana", "prompt": "a lighthouse at dusk", "response_format": "b64_json"}).encode()
headers = {"Content-Type": "application/json"}
challenge = requests.post(url, data=body, headers=headers)
assert challenge.status_code == 402
info = challenge.json()
print("Pay", info["amount_sats"], "sats:", info["invoice"])
preimage = pay_with_your_wallet(info["invoice"]) # 64 hex characters
# L402
mac = re.search(r'L402 macaroon="([^"]+)"', challenge.headers["WWW-Authenticate"]).group(1)
res = requests.post(url, data=body, headers={**headers, "Authorization": f"L402 {mac}:{preimage}"})
print(res.json()["nymbot"])
JavaScript
const url = "https://nymbot.ai/api/v1/images/generations";
const body = JSON.stringify({ model: "nano-banana", prompt: "a lighthouse at dusk", response_format: "b64_json" });
const headers = { "Content-Type": "application/json" };
const challenge = await fetch(url, { method: "POST", headers, body });
const www = challenge.headers.get("www-authenticate");
// The Payment scheme: echo every challenge parameter back with the preimage
const start = www.indexOf("Payment ");
const params = Object.fromEntries([...www.slice(start + 8).matchAll(/(\w+)="((?:[^"\\]|\\.)*)"/g)].map((m) => [m[1], m[2]]));
const { invoice } = JSON.parse(Buffer.from(params.request, "base64url").toString()).methodDetails;
const preimage = await payWithYourWallet(invoice);
const credential = Buffer.from(JSON.stringify({ challenge: params, payload: { preimage } })).toString("base64url");
const res = await fetch(url, { method: "POST", headers: { ...headers, Authorization: `Payment ${credential}` }, body });
console.log((await res.json()).nymbot, res.headers.get("payment-receipt"));
ደቂኣንቲ ዝተሓንጹ ኣብ mppx ብመትዲ ልይትኒንግ፡ ፈተና ክፍሊት ባዕሎም ይፍትኑ፤ ናብቲ መወዳእታ ኣርቶም ከኣ ክፍሉ ይፍቱ።
ቪድዮታት
ዝኽፈሉ POST /videos መልስታት 202 ከመ ሓደ ቁልፊኡ ዘለዎ፣ ብተወሳኺ ሓደ
status_url: GET ከመጽናዕቲ እቲ ስራሕ ንምከታተል ዝኾነ መደብ ዘይብሉ፡፡ ተሓፊኡ ኣሎ፣ ከምኡ እውን ስራሕ እቲ ዝጸንሐ ክከታተል ከሎ ን24 ሰዓታት ይሰርሕ።
{
"id": "vid_...",
"status": "in_progress",
"status_url": "https://nymbot.ai/api/v1/videos/vid_...?exp=1790000000&sig=...",
"nymbot": {
"payment": "l402", "tier": "pro", "paid_sats": 4800, "charged_sats": 4800,
"refund_token": "REFUND-5E0B..."
}
}
ኩዕየ ኣkeep እዛ refund_token ካብዚ ምላሽ፦ ኣብዚ ጥራይ እዩ ዝርአ። ቪድዮኡ ክፍጠር ከሎ ድማ ባዶ እዩ (GET /api/v1/l402/refunds መልስታት "status": "pending");
እቲ ኣርእያ (render) ብዘይተክሲል (unbilled) እንተተሰናክል፡ ክፍሊት ኣብኡ ይወድቕ። እቲ ኣৱታው (status) URL ከምዚ ዘርእይ እዩ፦
refund_sats ንተመሊሱሉ ስራ (refunded job) ግንቶክን (token) ኣይተሰዲዱን፣ ስለዚ ናይ ኩነታት (status) URL ምልጋስ ምልሳ (refund) ኣይገልጽን። ቶክን ምርመራ ድማ ንዝኾነ ሰብ ዘይተጠየቐ (nobody polled) ዝተኸሸሸ ስራ (failed job) የወራረድ።
መመለሲታት ገንዘብ
ሓደ ብዝኽሪ ዝኽሪ ዝፍጸም ሕቶ (paid request) እንተተሰናክልን፣ እቲ ኣቕራቢ ንዕንሰት እቲ ሕቶ ን Nymbot እንተኸፍሉ፣ ክፍሊት እቲ ገንዘብ ይቕጽልን
እቲ ጌጋ ድማ ብዚህሉ ይግለጽ፣ ብ... charged_sats፣ ከመልክዓዊ ሕቶ (keyed request) ንኣብነት ከም ዘሎ exactly። እንተተሰናክለ (fail)
ብዘይተኸፈልካ፣ እቲ ስሕተት የረድኤት ዓረፍተንት carries a መመለሲ Token (refund token) ብደፈረተካ መPayቲ ምስጊም፦
{
"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"
}
}
ዘይተጥቀመሎም ኣparts ብዘለዎ መገዲ ይምለሱ: ክልተ ምስሊ እንተሓተኻን ሓደ እንተተሰናኪሉ ብዘይ ምፍታው፣
መልሲ እቲ ዝተሳለጠ እዚ... nymbot እቲ መደብ ንዝጎደለ እቲ ክሳብ ሕጂ ዘሎ ናብ ምልላሲ ዝኸይድ መተወዓታ (refund token) ይሓዝ፤
እቲ ርዝማን ዘይተንብአ ዝኸውን ትሕዝቶ (transcription)፡ ብዝዓበተ እቲ ፋይል ክኸውን ዝኽእል ርዝማን ተሰቢዑ ዋጋ ይቕጽወ (ዘይብኣሉ ን30 ደቂቃ)፣ እቲ ምስ ናይቲ ናይ ሓቂ ርዝማን ዘሎ ፍልልዮ ድማ ከም መተወዓታ (refund token) ተመላሲ ይፍጠር፤ እቲ ርዝማን ካብ 30 ደቂቃ ዝላዕለይ እንተኸውን ግን ብ... ይኣርፍ። 413
ኣብኡኡ ድማ ምሉእ ክፍሊት ተመለሰ። Embdings እቲ ግምታ ዝሓዘ እንተን መለሰ። እንተተሰናክፈት ቪድዮ፡ እቲ ብምእታው ዝረኸበቶ ቶከና ተመላሲ ይግበር።
ቶክን ምልReturned (refund token) ናይ випадዕት 256-bit ኮድ እዩ። Nymbot ሃሽኡ ጥራይ እዩ ዝሕዝ፣ ከምኡ እውን ድሕሪ 30 መዓልታት ይውዳእ። ናይ sat ባላንስ ይሕዝ፣ ንስኻ ድማ፦
- ብኡ ክፈል ኣላኽእ
Authorization: Bearer REFUND-…ብማእረላይ ካብቲ ላዕላይ ዘለዉ ኣቐዲምቲ መተግበሪታት (Open OpenAI SDK ከም API key ይቕበሎ)። እቲ ዋጋ ካብቶም Token ዝውሰድ ኮይኑ፡ እቲ ዝተረፈ ግን ኣብኡ ይቕጽል (refund_token_satsኣብቲnymbotከመጠይቐኡ ንላዕሊ ዋጋ ዘይብሉ ምልክት)።402refund_insufficient; ዘይተዋሪ ውድቀት ነቲ sats ኣብቲ ተመሳሳሊ ቶክን ይመልሶም:: - Check ይበልዎ።
GET /api/v1/l402/refundsብኡ ርእስቲት መልሲ ይሃብ{"sats": 237, "status": "open", "expires_at": "..."}. - ሓደ ቶክን ኣብ ሓደ ደቒቕ ከብዝበለ ኣገባብ 60 ግዜ ጥራይ ክጥቀመሉ ይኽእል እዩ።
- ናይ መዝባይ ናብ ኣሎምነት ኣላልዕዎ። ኣብኡ ኣተвውሶ መጸዋዕቲ (gift) ተጠቐም ኣብቲ
Nymbot ኣፕላይኬሽን፣ ወይ ደው ኢልካ
POST /api/v1/l402/refunds/redeemብ... ተመርዐት ዘይተመርመዐ ሕቶ እና{"refund_token": "REFUND-...", "balance": "standard"}(ወ]"pro"). ምሉእ ክሬዲት ናብ ሚዛን ይኸውድ (ኣብ standard 10 sats፣ ኣብ Pro 100 sats)፤ ምሉእ ክሬዲት ዘይፈጥሩ sats ግን ንAPI requests ኣብቲ ቶክን ይቕጽሉ፡፡
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 } }