ናብ ትሕዝቶ ዘልል
ናብ Nymbot ተመለስኩ

መሰረት ፍልጠት ደቨሎፐራዊት (ኣልጋእ ስራሕ)

ሚዛን፣ መተเติมታትን ከ ቁልፍታት ጋር

ዝበለኻዮ ነገር ፈትሽ፣ ብ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_date
end_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 ምስ... እቲ ኩታ ብዛዕባ ኩታ መበልተታዊ ሓ状 ክሬዲት ይቕጽሎ።

ማይምዌlet ቅድሚ ምትእኻልኩም

ናይ ኮኔክሽን ስትሪንግ (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 ፊደላት) ይህልካ እዩ። ድሕሪኡ ነዚ ተመሳሳሊ ሕቶ ካብ እዞም ዝስዕቡ ብነተይ ተላክ፦

እቅድኣርእስቲ
L402Authorization: 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 ከመጠይቐኡ ንላዕሊ ዋጋ ዘይብሉ ምልክት)። 402 refund_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 } }