انتقل إلى المحتوى
العودة إلى Nymbot

قاعدة المعرفة المطورين

التوازن والخلفيات والأصابع

تحقق من ما لديك، تحقق من Lightning، تحقق تلقائيًا من حسابك الخاص، انظر ما تكلفه كل طلب، وإدارة المفاتيح من الكود.

التحقق من التوازن

كلا من توازناتك ، وكما يتم استخدام كمية من كفة هذا المفتاح.

GET https://nymbot.ai/api/v1/credits/balance تحتاج إلى مفتاح API. POST تعمل أيضا ، للعملاء الذين يتوقعون ذلك.

balance هو التوازنات المشتركة في الدولارات في سعر بوتين الحالي، بالنسبة للأدوات التي تتوقع رقم واحد (null إذا كان السعر لا يمكن قراءته).الخيار هو في الائتمان والضرائب، وهذا هو الطريقة التي يتم الحفاظ عليها في الواقع. key يشرح المفتاح الذي طلب، ويمكن أيضًا التحقق من التوازن.

الإجابة

{
  "balance": 49.18,
  "balance_sats": 42037,
  "standard": { "credits": 120.4, "sats": 1204 },
  "pro": { "credits": 408.33, "sats": 40833 },
  "key": {
    "id": "4f0c9a1be27d3856",
    "name": "laptop scripts",
    "limit_sats": 20000,
    "period_used_sats": 3412,
    "total_used_sats": 18230,
    "reset_period": "monthly",
    "reset_at": "2026-10-01T00:00:00Z"
  }
}
الوضععندما
401المفتاح غير معروف أو مفقود أو مفقود.

cURL

curl https://nymbot.ai/api/v1/credits/balance \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os
import requests

res = requests.get(
    "https://nymbot.ai/api/v1/credits/balance",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
)
balance = res.json()
print(balance["standard"]["sats"], balance["pro"]["sats"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/credits/balance", {
  headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
const balance = await res.json();
console.log(balance.standard.sats, balance.pro.sats);

طرق الدفع

كيف يمكن أن تصل إلى الحد الأقصى، والحد الأقصى.

GET https://nymbot.ai/api/v1/topup/payment-methods لا حاجة إلى مفتاح

يبدأ التكلفة من 10 إلى 1،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000،000. bulk_bonus يحدد الائتمان الإضافي على أعلى أعلى، كما هو الحال في التطبيق: 10٪، 15٪ أو 20% أكثر على أعلى أعلى من 500، 1000 أو 5000 أسهم، و على أعلى أعلى من 5000، 10,000 أو 50،000 أسهم.

الإجابة

{
  "supported_methods": [
    {
      "method": "btc-lightning",
      "display_name": "Bitcoin Lightning",
      "supported_currencies": ["SATS", "USD", "BTC"],
      "limits": {
        "SATS": { "min": 10, "max": 1000000 },
        "USD": { "min": 0.02, "max": 1170 },
        "BTC": { "min": 1e-7, "max": 0.01 }
      },
      "tiers": ["standard", "pro"],
      "default_tier": "pro",
      "tier_min_sats": { "standard": 10, "pro": 100 },
      "sats_per_credit": { "standard": 10, "pro": 100 },
      "bulk_bonus": [
        { "bonus": 0.1, "standard_sats": 500, "pro_sats": 5000 },
        { "bonus": 0.15, "standard_sats": 1000, "pro_sats": 10000 },
        { "bonus": 0.2, "standard_sats": 5000, "pro_sats": 50000 }
      ]
    }
  ]
}

cURL

curl https://nymbot.ai/api/v1/topup/payment-methods

Python

import requests

methods = requests.get("https://nymbot.ai/api/v1/topup/payment-methods").json()
print(methods["supported_methods"][0]["limits"])

JavaScript

const methods = await (await fetch("https://nymbot.ai/api/v1/topup/payment-methods")).json();
console.log(methods.supported_methods[0].limits);

تساقط فوق الضوء

يخلق حساب الفراش الذي يضيف القيمة إلى الفراش الذي يملك المفتاح. تحقق من من أجل الحصول على القيمة المضافة.

POST https://nymbot.ai/api/v1/topup/create/btc-lightning تحتاج إلى مفتاح API.

الفضاءنوعالمطلوبوصف
amountرقمنعمكم، في currencyعدد كامل من الأسهم.
currencyStringلاSATS (الإيمان باليوم الآخر) USD أو BTCيتم تحويل الدولارات إلى سعر بيتكوين الحالي.
tierStringلاpro (الخطأ) أو standard: ما هو التوازن الذي يمر به القرض.

الائتمان القياسي هو 10 سعر و Pro الائتمان 100 سعر ، بالإضافة إلى أي مكافأة كبيرة. credits ويقول ماذا سيضيف هذا الحساب.

الإجابة

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
الوضععندما
400طريقة أخرى في الطريق (unsupported_method) ، وهي العملة غير المعروفة (unsupported_currencyأو أقل، أو أقل، أو أقل، أو أقل، أو أقل.amount_too_small(أو أكثر من 1 مليار دولار)amount_too_large) أو رفضت من قبل محفظة الضوء (amount_out_of_range).
429أكثر من 60 رسالة من هذا النوع، أو 120 من هذا الموقع، في ساعة واحدة (rate_limit_exceeded، مع Retry-After).
502لا يمكن إنشاء حساب في الوقت الحالي (invoice_unavailable، مع Retry-After).

cURL

curl https://nymbot.ai/api/v1/topup/create/btc-lightning \
  -H "Authorization: Bearer $NYMBOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"amount": 10000, "currency": "SATS", "tier": "pro"}'

Python

import os
import requests

res = requests.post(
    "https://nymbot.ai/api/v1/topup/create/btc-lightning",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
    json={"amount": 10000, "currency": "SATS", "tier": "pro"},
)
invoice = res.json()
print(invoice["payment_request"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/topup/create/btc-lightning", {
  method: "POST",
  headers: {
    "Authorization": "Bearer " + process.env.NYMBOT_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ amount: 10000, currency: "SATS", tier: "pro" }),
});
const invoice = await res.json();
console.log(invoice.payment_request);

البحث عن Top-up

يطلب ما إذا كانت الحساب قد تم دفعها ، وبعد ذلك ، يضيف الائتمان. التحقق هو ما تصل إليه ، لذلك بعد الدفع ، تحقق حتى الوضع هو creditedالتحقق مرة أخرى في وقت لاحق هو آمن: الحد الأدنى من الائتمان مرة واحدة، بغض النظر عن عدد المرات التي تريد.

GET https://nymbot.ai/api/v1/topup/status/{invoice_id} - يحتاج إلى مفتاح من نيم الذي صنع الحساب.

status هي pending (لأنه لم يُقدّم حتى الآن) paid (مكافأة، ولكن لم يتم اعتبارها حتى الآن؛ تحقق مرة أخرى)، credited (بعد توازنك) أو expired (لا يكلف الله نفسا إلا وسعها لها ما كسبت وعليها ما اكتسبت)

الإجابة

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "status": "credited",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": null,
  "balance_credits": 523.33,
  "balance_sats": 52333
}
الوضععندما
400ID ليست هوية 64 علامة من الدعوة التي تم إنشاءها.
404لا يوجد حساب من هذا النوع من الأدلة على نجاحك (invoice_not_found).

cURL

curl https://nymbot.ai/api/v1/topup/status/$INVOICE_ID \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os, time
import requests

headers = {"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]}
url = "https://nymbot.ai/api/v1/topup/status/" + invoice["invoice_id"]

while True:
    status = requests.get(url, headers=headers).json()["status"]
    if status in ("credited", "expired"):
        break
    time.sleep(3)
print(status)

JavaScript

const headers = { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY };
const url = "https://nymbot.ai/api/v1/topup/status/" + invoice.invoice_id;

let status;
do {
  await new Promise((r) => setTimeout(r, 3000));
  status = (await (await fetch(url, { headers })).json()).status;
} while (status !== "credited" && status !== "expired");
console.log(status);

تريد التاريخ

صفحة واحدة لكل طلب: ماذا كان، ما هو النموذج، كم عدد القطط، وما هي تكاليفه. لا يتم الاحتفاظ باللقاءات أو الإجابة، لذلك لا يتم إعادة أي صفحة. يتم الاحتفاظ باللقاءات لمدة 90 يوماً، أحدث أولاً. ويمكن أيضًا قراءة تاريخها.

GET https://nymbot.ai/api/v1/queries/history - يحتاج إلى مفتاح API، الذي يرى طلباته الخاصة، أو التوقيع التوقيع من نيمك، الذي يرى كل مفتاح.

الفضاءنوعالمطلوبوصف
pageالكلمات الدلالية (query)لا1 على الأقل 1000؛ صفحة أعلى هي 400 invalid_value.
page_countالكلمات الدلالية (query)لاالحد الأدنى للصفحة: 20 على الأقل.
start_date
end_date
أندرويد (Query)لاISO 8601 تاريخ أو ساعات.
modelأندرويد (Query)لافقط هذا النموذج
typeأندرويد (Query)لاchat, responses, messages, image, video, speech, transcription أو embedding.
all_keysبوتين (Query)لامع مفتاح : true يتضمن كل مفتاح من نفس nym.Default false.
key_idأندرويد (Query)لامع الطلب المقبول، أو مع all_keys=trueفقط هذا المفتاح.

الإجابة

{
  "data": [
    {
      "id": "q_71c4e9a0",
      "timestamp": "2026-09-30T08:12:00Z",
      "model": "anthropic/claude-sonnet-5",
      "type": "chat",
      "input_tokens": 1240,
      "output_tokens": 380,
      "cached_tokens": 0,
      "cost_sats": 16.2,
      "cost_usd": 0.01895,
      "balance": "pro",
      "key_id": "4f0c9a1be27d3856",
      "web_search": false,
      "status": "ok"
    }
  ],
  "pagination": { "page": 1, "page_count": 20, "total": 311, "total_pages": 16 }
}

cURL

curl "https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat" \
  -H "Authorization: Bearer $NYMBOT_API_KEY"

Python

import os
import requests

res = requests.get(
    "https://nymbot.ai/api/v1/queries/history",
    headers={"Authorization": "Bearer " + os.environ["NYMBOT_API_KEY"]},
    params={"page_count": 50, "type": "chat"},
)
for row in res.json()["data"]:
    print(row["timestamp"], row["model"], row["cost_sats"])

JavaScript

const res = await fetch("https://nymbot.ai/api/v1/queries/history?page_count=50&type=chat", {
  headers: { "Authorization": "Bearer " + process.env.NYMBOT_API_KEY },
});
for (const row of (await res.json()).data) console.log(row.timestamp, row.model, row.cost_sats);

التوقيع على طلبات الحساب

إن إنشاء، والتغيير والتحذير من المفاتيح، وتقييم الحساب والخلفية التلقائية لا تأخذ مفتاح API.

التطبيق يفعل هذا بالنسبة لك: كل شيء في النار تستخدم هذه النقطة النهائية. تحتاج فقط إلى هذا القسم لإدارة المفاتيح من رمزك الخاص.

التوقيع هو حدث Nostr من نوع 27235 (NIP-98)، يتم إرسال base64-مسجمة في Authorization Header مع الكلمة Nostr في الجانب الأمامي:

الحدث

{
  "kind": 27235,
  "created_at": 1790726400,
  "tags": [
    ["u", "https://nymbot.ai/api/v1/keys"],
    ["method", "POST"],
    ["nonce", "9c4e21f07a3b...16 random bytes in hex"],
    ["payload", "3f1a0d7c8e2b...sha256 of the exact request body in hex"]
  ],
  "content": "",
  "pubkey": "your public key in hex",
  "id": "...",
  "sig": "..."
}
  • u هو URL الكامل للطلب، وتشمل سلسلة الاستفسارات، تماما كما تم إرسالها.
  • method هذا هو طريقة HTTP.
  • payload هو SHA-256 من جسم الطلب الأسود، في الفئة السادسة. POST و PATCHويجب أن يكون الجسم الذي تريد إرساله هو بيتي لكل بيتي الذي تريد إرساله.
  • created_at يجب أن يكون في غضون 60 ثانية من ساعات المورد.
  • كل حدث يعمل مرة واحدة ، a GET لا يمكن إعادة تشغيل العلامة المكتوبة التي تم تخزينها. تسجيل جديد لكل طلب. nonce تقييم مع قيمة عشوائية حتى يتم تقييم اثنين من الطلبات المقبولة في نفس ثانية لا تزال مختلفة.
  • يمكن أن يكون الجسم من طلب مكتوب إلى حد ما 64 كابيتال ، ويحتاج الجسم إلى Content-Type: application/json.

عودة الحدث المفقود 401 missing_nostr_authواحدة التي تم تشكيلها بشكل سيئ، وتوزيعها بشكل سيئ، أو قديمة للغاية، أو لمواقع URL، أو الطريقة أو الجسم مختلفة. invalid_nostr_authوَقَالَ ابْنُ عَبَّاسٍ وَالْحَسَنُ وَقَتَادَةُ وَالْحَسَنُ وَقَتَادَةُ وَالْحَسَنُ وَقَتَادَةُ وَالسُّدِّيُّ وَقَتَادَةُ. nostr_auth_replayedيتم إلغاء مفتاح API يتم إرساله إلى هذه النقطة النهائية. يتم التحقق من التوقيت قبل قراءة الجسم ، ويمكن لكل عنوان أن يفشل في ذلك 30 مرة في الدقيقة (الرقم IPv6 يقدر بأكملها /64) ؛ بعد ذلك يتم الحصول على 429 مع Retry-After.

يمكن للبرمجيات إرسال هذه النقطة النهائية من مواقع Nymbot الخاصة (https://nymbot.ai, https://nymchat.app وبالإضافة إلى ذلك، فإن صفحة في أي موقع آخر لا تتمكن من إعادة عنوانات CORS، لذلك لا يمكنهم قراءة ما يعود عليهم. Originلا تؤثر على

المفتاح الخاص بك

التوقيع يحتاج إلى مفتاح هام الخاص بك (ال nsec، الذي يسيطر على كل شيء: هويتك، تاريخك ومستوىك. فقط وضعها في سجل على جهاز تثق به، قراءةها من البيئة بدلاً من كتابتها إلى الملف، ويفضل التطبيق عندما يمكنك.

هذه المساعدة تخطط لإنشاء العلامة.الأمثلة التالية على هذه الصفحة تستخدمها.أنهم يقرأون المفتاح السرية في الفئة السادسة من NOSTR_SECRET_HEX• يُستخدم CURL 1 نان أداة خطة الأوامر ، والتي تتخذ ميزة nsec أو Hex ، و sha256sum في ماكسو , shasum -a 256).

cURL

nostr_auth() {
  method="$1"; url="$2"; body="$3"
  nonce=$(openssl rand -hex 16)
  if [ -n "$body" ]; then
    hash=$(printf '%s' "$body" | sha256sum | cut -d' ' -f1)
    event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce" -t "payload=$hash")
  else
    event=$(nak event --sec "$NOSTR_SECRET_HEX" -k 27235 -t "u=$url" -t "method=$method" -t "nonce=$nonce")
  fi
  printf 'Nostr %s' "$(printf '%s' "$event" | base64 | tr -d '\n')"
}

Python

# pip install coincurve requests
import base64, hashlib, json, os, time
from coincurve import PrivateKey, PublicKeyXOnly

SECRET = bytes.fromhex(os.environ["NOSTR_SECRET_HEX"])

def nostr_auth(method, url, body=b""):
    pubkey = PublicKeyXOnly.from_secret(SECRET).format().hex()
    tags = [["u", url], ["method", method], ["nonce", os.urandom(16).hex()]]
    if body:
        tags.append(["payload", hashlib.sha256(body).hexdigest()])
    created_at = int(time.time())
    serialized = json.dumps([0, pubkey, created_at, 27235, tags, ""], separators=(",", ":"), ensure_ascii=False)
    event_id = hashlib.sha256(serialized.encode()).digest()
    event = {
        "id": event_id.hex(),
        "pubkey": pubkey,
        "created_at": created_at,
        "kind": 27235,
        "tags": tags,
        "content": "",
        "sig": PrivateKey(SECRET).sign_schnorr(event_id).hex(),
    }
    return "Nostr " + base64.b64encode(json.dumps(event).encode()).decode()

JavaScript

// npm install nostr-tools
import { createHash, randomBytes } from "node:crypto";
import { finalizeEvent } from "nostr-tools/pure";

const secret = Buffer.from(process.env.NOSTR_SECRET_HEX, "hex");

export function nostrAuth(method, url, body = "") {
  const tags = [["u", url], ["method", method], ["nonce", randomBytes(16).toString("hex")]];
  if (body) tags.push(["payload", createHash("sha256").update(body).digest("hex")]);
  const event = finalizeEvent(
    { kind: 27235, created_at: Math.floor(Date.now() / 1000), tags, content: "" },
    secret,
  );
  return "Nostr " + Buffer.from(JSON.stringify(event)).toString("base64");
}

محفظة الحساب

ما يظهر في ورقة API في التطبيق أعلى: المفتاح العام الخاص بك، وكلا التوازنات، كم من المفتاحات فعالة (لأنه لم يتم إلغاءها أو قد تنتهي). تلقائيا Top-up الإعدادات، أو null عندما لا يقدم المورد.

GET https://nymbot.ai/api/v1/account تحتاج إلى a التوقيع التوقيع.

الإجابة

{
  "data": {
    "pubkey": "3bf0c63fcb93463407af97a5e5ee64fa883d107ef9e558472c4eb9aaaefa459d",
    "balances": {
      "standard": { "credits": 120.4, "sats": 1204 },
      "pro": { "credits": 408.33, "sats": 40833 }
    },
    "keys_active": 3,
    "nwc_auto_topup": {
      "connected": true, "threshold_sats": 5000, "topup_sats": 20000, "tier": "pro",
      "last_topup_at": null, "last_topup_sats": null, "last_error": null
    }
  }
}

cURL

URL=https://nymbot.ai/api/v1/account
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/account"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/account";
const res = await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } });
console.log(await res.json());

إدارة المفتاح

نقطة نهاية خلف قائمة المفتاح في التطبيق. كلها بحاجة إلى التوقيع التوقيعيتم العودة كل مفتاح في هذا النموذج، مع أوقات في ISO 8601 ومعدلات في sats:

الموضوع الرئيسي

{
  "id": "4f0c9a1be27d3856",
  "name": "laptop scripts",
  "hint": "sk-nymbot-Qm7x…c2Lw",
  "limit_sats": 20000,
  "reset_period": "monthly",
  "reset_at": "2026-10-01T00:00:00Z",
  "expire_at": null,
  "period_used_sats": 3412,
  "total_used_sats": 18230,
  "created_at": "2026-08-14T09:21:07Z",
  "updated_at": "2026-09-02T17:40:55Z",
  "last_used_at": "2026-09-30T08:12:00Z",
  "revoked_at": null
}

hint يكفي لتعرف المفتاح ولكن لا تستخدمه، وتعود المفتاح نفسه مرة واحدة فقط عندما يتم إنشاؤه.

قائمة المفتاح

GET https://nymbot.ai/api/v1/keys ثم التوقيع.

الفضاءنوعالمطلوبوصف
include_revokedبوتين (Query)لاإدخال المفاتيح المحذوفة.المفتاح false.

الإجابة

{ "data": [ { "id": "4f0c9a1be27d3856", "name": "laptop scripts", "hint": "sk-nymbot-Qm7x…c2Lw", "...": "..." } ] }

cURL

URL=https://nymbot.ai/api/v1/keys
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/keys"
for key in requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"]:
    print(key["id"], key["name"], key["period_used_sats"], key["limit_sats"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys";
const { data } = await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json();
for (const key of data) console.log(key.id, key.name, key.period_used_sats, key.limit_sats);

إنشاء مفتاح

POST https://nymbot.ai/api/v1/keys رد: عودة 201.

الفضاءنوعالمطلوبوصف
nameStringنعم1 إلى 40 علامة مختلفة عن المفتاحات النشطة الأخرى (الخوف من الحالة).
limit_satsالنسيجلاالتكلفة في الأسهم ، على الأقل 1 ، أتركها بدون كلفة.
reset_periodStringلاdaily, weekly أو monthlyاحتياجات limit_satsقم بتخزينها لقطة لا تنتهي أبدا.
expire_atString أو integerلاعندما يتوقف المفتاح عن العمل: ISO 8601 مرة، أو ميلي ثانية منذ عام 1970.

ردود الفعل (201)

{
  "data": {
    "id": "4f0c9a1be27d3856",
    "name": "laptop scripts",
    "hint": "sk-nymbot-Qm7x…c2Lw",
    "limit_sats": 20000,
    "reset_period": "monthly",
    "key": "sk-nymbot-Qm7x...c2Lw",
    "...": "the rest of the key object"
  }
}
الوضععندما
400اسم مفقود أو لفترة طويلة جدًا؛ اسمًا مستخدمًا (duplicate_name( 1 ) ؛ حد لا يتجزأ أقل من 1 ؛ فترة الاسترداد دون حد ؛ انتهاء في الماضي ؛ مساحة غير معروفة (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 إذا لم يكن مفتاحك لديه هذا 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 (لا يمكن تغييره، لا يمكن تغييره، لا يمكن تغييره، لا يمكن تغييره)400 key_revoked) العودة {"data": {…}} مع المتصفح المحدد.

cURL

URL=https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856
BODY='{"limit_sats":50000,"expire_at":null}'
curl -X PATCH "$URL" \
  -H "Authorization: $(nostr_auth PATCH "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Python

import json
import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
body = json.dumps({"limit_sats": 50000, "expire_at": None}).encode()
res = requests.patch(
    url,
    data=body,
    headers={"Authorization": nostr_auth("PATCH", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const body = JSON.stringify({ limit_sats: 50000, expire_at: null });
const res = await fetch(url, {
  method: "PATCH",
  headers: { "Authorization": nostrAuth("PATCH", url, body), "Content-Type": "application/json" },
  body,
});
console.log((await res.json()).data);

إلغاء مفتاح

DELETE https://nymbot.ai/api/v1/keys/{id} ثم التوقيع.

توقف المفتاح على الفور، على الأقل. يبقى في القائمة مع revoked_at يتم وضعها، ويمكن رؤيتها مع include_revoked=trueإلغاء المفتاح الذي تم إلغائه بالفعل يفيد بنفس الطريقة فقط يتم الحفاظ على أحدث 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 Auto-Top-Up

اتصلت بشبكة Lightning Wallet مع Nostr Wallet Connect و Nymbot تصل إلى التوازن بنفسك عندما تتراوح استهلاك API بها منخفضة. التوقيع التوقيع.

كيف تعمل: بعد إرسال طلب API إلى التكلفة التي اخترت مشاهدةها، إذا انخفض التكلفة فوق حدودك، تقوم Nymbot بإنشاء حساب على مبلغ التكلفة الخاصة بك، وتطلب من الكمبيوتر الخاص بك دفعها، وإضافة الائتمان. موقع Top-Up تمنحها

قبل إدخال محفظة

يتيح سلسلة الاتصال لأولئك الذين يحتفظون بها طلب المال الخاص بك. Nymbot تخزينها رمزيا وتستخدمها فقط لتسديد رسومها الخاصة بها، ولكن جعل الاتصال فقط لهذا، مع ميزانية التكلفة في بيتك، حتى أكبر ما يمكن أن تدفعه هو رقم اختارك. pay_invoice.

الاتصال بالبضائع

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect ثم التوقيع.

الفضاءنوعالمطلوبوصف
nwc_urlStringنعمخط الاتصال ، بدءاً nostr+walletconnect://Nymbot يطلب من محفظة get_info قبل تخزينها، وتخزينها رمزية.
threshold_satsالنسيجنعمأدناه عندما ينخفض التكلفة أقل من هذا العدد الكثير من الأسهم.
topup_satsالنسيجنعمكم تكسب كل مرة؟ 1000 إلى 1,000,000 sats.
tierStringلا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) ؛ لا يمكن أن يتحمل الرابط حسابات (nwc_missing_permissionأو مبلغ خارج الحدود.
501لا يتم تشغيل تلقائيات التلقائيات في هذا المكتب (nwc_unavailableكما هو الحال بالنسبة للعديد من نقاط النهاية الأخرى.

cURL

URL=https://nymbot.ai/api/v1/nwc-auto-topup/connect
BODY='{"nwc_url":"nostr+walletconnect://...","threshold_sats":5000,"topup_sats":20000,"tier":"pro"}'
curl "$URL" \
  -H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Python

import json, os
import requests

url = "https://nymbot.ai/api/v1/nwc-auto-topup/connect"
body = json.dumps({
    "nwc_url": os.environ["NWC_URL"],
    "threshold_sats": 5000,
    "topup_sats": 20000,
    "tier": "pro",
}).encode()
res = requests.post(
    url,
    data=body,
    headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json())

JavaScript

const url = "https://nymbot.ai/api/v1/nwc-auto-topup/connect";
const body = JSON.stringify({
  nwc_url: process.env.NWC_URL,
  threshold_sats: 5000,
  topup_sats: 20000,
  tier: "pro",
});
const res = await fetch(url, {
  method: "POST",
  headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
  body,
});
console.log(await res.json());

قراءة الإعدادات

GET https://nymbot.ai/api/v1/nwc-auto-topup ثم التوقيع.

يعود المكون نفسه مثل الاتصال ، مع connected: false والقطاعين الآخرين null إذا لم يتم اتصال أي محفظة، لا يتم إعادة الشبكة نفسها.

cURL

URL=https://nymbot.ai/api/v1/nwc-auto-topup
curl "$URL" -H "Authorization: $(nostr_auth GET "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/nwc-auto-topup"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/nwc-auto-topup";
console.log(await (await fetch(url, { headers: { "Authorization": nostrAuth("GET", url) } })).json());

الانسحاب

DELETE https://nymbot.ai/api/v1/nwc-auto-topup/connection ثم التوقيع.

إزالة سلسلة الاتصال المتوفرة. لا يتم إنشاء أي تغطية أخرى. للتأكد من ذلك، يمكنك أيضًا إلغاء الاتصال في محفظتك.

الإجابة

{ "data": { "connected": false, "threshold_sats": null, "topup_sats": null, "tier": null, "last_topup_at": null, "last_topup_sats": null, "last_error": null } }

cURL

URL=https://nymbot.ai/api/v1/nwc-auto-topup/connection
curl -X DELETE "$URL" -H "Authorization: $(nostr_auth DELETE "$URL")"

Python

import requests

url = "https://nymbot.ai/api/v1/nwc-auto-topup/connection"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/nwc-auto-topup/connection";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());

الدفع على الطلب دون مفتاح

يمكن دفع نقطة انتهاء الأسعار المرتفعة لكل طلب في وقت واحد خلال Lightning ، بدون مفتاح ، ولا حساب ، ولا التكلفة: POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations و POST /embeddingsتتطلب الدردشة والردود والرسائل دائمًا مفتاحًا، وتتلقى طلبًا يحمل مفتاحًا إلى النفق كما هو الحال في المعيار الطبيعي؛ يبدأ تدفق الدفع فقط عندما لا يتم إرسال مفتاح.

Nymbot يتحدث عن اثنين من الإصدارات من نفس الفكرة، من الخلفية واحدة: Lightning Labs L402 (وهو أيضاً تحت اسمها القديم) LSAT) و مشروع IETF الدفع نظام التأكد HTTP مع lightning الطريقة و charge إستخدام ما يعرفه العملاء.

تشغيل خادمك الخاص

الدفع دون المفتاح هو على فقط عندما API_L402_SECRET يحتوي على 32 بيتاً على الأقل، مثل السترات (64 علامة) أو base64 (44). openssl rand -hex 32إن قيمة أقصر أو قابلة للتنبؤ تنبئ الميزات وتسجل لماذا. لتنقلها، قم بتحرك القيمة القديمة إلى API_L402_SECRET_PREVIOUS لمدة يوم واحد: تظل الوثائق والمواقع الإلكترونية المستمرة والتحديات التي تم إنشاؤها تحتها تعمل حتى تنتهي.

التحدي

إرسال طلب مع لا Authorization إذا كان صحيحًا، لا شيء يعمل، وكنت 402 Payment Required مع رسالة للغاية ما يصل إلى هذا الطلب: نفس السعر الذي سوف يدفعه المفتاح ، يتم تحويلها إلى 10 سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر سعر س 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 التقييم : base64url JSON : {"amount":"237","currency":"sat","methodDetails":{"invoice":"lnbc...","network":"mainnet","paymentHash":"..."}}.

التحدي يرتبط بالطريقة النهائية ، إلى Content-Type (هو نوع الوسائط و ، بالنسبة للعديد من الأجزاء ، الحدود) و إلى SHA-256 من الملفات الجسدية الحقيقية التي أرسلتها ، ويستمر لمدة 15 دقيقة. ذاتية إقرأ المزيد: نفس الشيء Content-Type وبهذه الطريقة، يمكن أن تتمكن من إعادة تثبيت الأقمار الصناعية (/images/edits, /audio/transcriptions, /audio/translationsمعظم مكتبات HTTP تختار حدودًا جدًا كلما تم تشفير شكل، لذلك تم تشفيرها مرة واحدة وإرسال تلك البيانات مرتين.

كل عنوان يمكن أن يطلب 30 تحديات في الدقيقة (الرقم IPv6 يقدر بأكملها /64). تحديات التي ليس لها عنوان معروف تشارك 10 أكثر صرامة في الدقيقة، وهناك حد أقصى على تحديات Nymbot في جميع الملفات؛ تحدي يرفض قبل إجراء تحديات (على سبيل المثال مع جسم غير معتاد JSON) لا يقدر على ذلك. 429 مع Retry-Afterيتم تقييم الأهداف المدفوعة التي يتم إرسالها بدون مفتاح أو إدخال أيضًا إلى الحد الأدنى العام من 120 طلبًا غير معتبرًا في دقيقة لكل عنوان. Content-Type ليس هو application/json (أو multipart/form-data وَأَمَّا الَّذِينَ سُعِدُوا فَفِي الْجَنَّةِ خَالِدِينَ فِيهَا 415 ولا يحصل على حساب أبداً.

يتم تقييم الإدخالات من إجمالي تقييمات القطط في الدخول ، مع 1.5&times؛ الحد الأدنى ، حيث يتم معرفة عدد الحقيقي فقط بعد ذلك. إعادة تقييم تقييم.

إرسال الدفع

ادفع الحساب مع أي محفظة الضوء. تمنحك المحفظة صورة إضافية، 64 علامة صغيرة. ثم إرسال نفس الطلب مع واحدة من هذه:

النظامHeader
L402Authorization: L402 <macaroon>:<preimage> (LSAT يعمل أيضاً)
الدفعAuthorization: Payment <base64url JSON>أين هي JSON {"challenge": {every parameter of the challenge, as sent}, "payload": {"preimage": "<hex>"}}

يجيب طلب مكافأة بالطبع كما هو الحال مع مفتاح ، إلا أن nymbot لا يوجد مساحات توازن: {"payment": "l402", "tier": "pro", "paid_sats": 237, "charged_sats": 237}و لكن ليس هناك X-Nymbot-Balance-Sats يقدم طلب دفع مع نظام الدفع أيضًا Payment-Receipt العنوان (base64url JSON مع ID التحدي، الحد الأدنى من الدفع reference, status و timestampلا يرتبط طلبات المدفوعات بأي نيم ، لذلك لا تظهر في تاريخ الاستفسارات.

الوضععندما
402 payment_already_usedكل دفع يلجأ إلى طلب واحد.الرد هو تحدي جديد لهذه الطلبة، وبالتالي، يستخدم المستخدم الذي يختبئ آخر مؤلفاته (مثل: lnget وَهُوَ يَقُولُ: إِنَّهُ يَقُولُ: إِنَّهُ يَقُولُ إِنَّهُ يَقُولُ.
402 payment_mismatchوقد تم إدخال الإشارة إلى نقطة أخرى، Content-Type أو الدفع أقل من هذا الطلب الآن تكلفة. تحدي جديد لهذا الطلب يأتي معه؛ إذا كان الدفع صغيرًا للغاية، ما ادفعته يعود كبديل. إعادة تقييم تقييم (refund_token و refund_sats في الجسم )
402 payment_expiredما يزيد عن 15 دقيقة منذ التحدي. يأتي التحدي الجديد معها.إذا أظهرت الصورة المفتوحة أنك اشتريت، فإن ما اشتريت يعود كإيداع. إعادة تقييم تقييم (refund_token و refund_sats في الجسم) مرة واحدة، ثم يتم استخدامه.
401 invalid_preimageلا يقلل الصورة المفتوحة عن هشاشة الدفع في الحساب.
401 invalid_payment_credentialيتم تغييره بعد إصدار Nymbot ، أو تسمية هشاشة الدفع Nymbot لم تتم إصدار حساب.
429 rate_limit_exceededأكثر من 30 من الوثائق أو المفاتيح التي لم تكن قادرة على التحقق جاءت من هذا عنوان في دقيقة واحدة، أو تم إرسال نقطة استرداد واحدة أكثر من 60 مرة في دقيقة. Retry-After.

cURL

BODY='{"model":"nano-banana","prompt":"a lighthouse at dusk","response_format":"b64_json"}'
URL=https://nymbot.ai/api/v1/images/generations

# 1. Get the challenge
CH=$(curl -s -D - -o /dev/null "$URL" -H "Content-Type: application/json" -d "$BODY" | grep -i '^www-authenticate: L402')
MAC=$(echo "$CH" | sed -E 's/.*macaroon="([^"]+)".*/\1/')
INVOICE=$(echo "$CH" | sed -E 's/.*invoice="([^"]+)".*/\1/')

# 2. Pay $INVOICE with your wallet and copy the preimage
PREIMAGE=...

# 3. Send the identical request with the credential
curl "$URL" -H "Content-Type: application/json" -H "Authorization: L402 $MAC:$PREIMAGE" -d "$BODY"

lnget

# lnget (Lightning Labs) pays L402 challenges from your own lnd node and retries for you
lnget -X POST -H "Content-Type: application/json" \
  -d '{"model":"nano-banana","prompt":"a lighthouse at dusk","response_format":"b64_json"}' \
  https://nymbot.ai/api/v1/images/generations

Python

import base64, json, re
import requests

url = "https://nymbot.ai/api/v1/images/generations"
body = json.dumps({"model": "nano-banana", "prompt": "a lighthouse at dusk", "response_format": "b64_json"}).encode()
headers = {"Content-Type": "application/json"}

challenge = requests.post(url, data=body, headers=headers)
assert challenge.status_code == 402
info = challenge.json()
print("Pay", info["amount_sats"], "sats:", info["invoice"])

preimage = pay_with_your_wallet(info["invoice"])  # 64 hex characters

# L402
mac = re.search(r'L402 macaroon="([^"]+)"', challenge.headers["WWW-Authenticate"]).group(1)
res = requests.post(url, data=body, headers={**headers, "Authorization": f"L402 {mac}:{preimage}"})
print(res.json()["nymbot"])

JavaScript

const url = "https://nymbot.ai/api/v1/images/generations";
const body = JSON.stringify({ model: "nano-banana", prompt: "a lighthouse at dusk", response_format: "b64_json" });
const headers = { "Content-Type": "application/json" };

const challenge = await fetch(url, { method: "POST", headers, body });
const www = challenge.headers.get("www-authenticate");

// The Payment scheme: echo every challenge parameter back with the preimage
const start = www.indexOf("Payment ");
const params = Object.fromEntries([...www.slice(start + 8).matchAll(/(\w+)="((?:[^"\\]|\\.)*)"/g)].map((m) => [m[1], m[2]]));
const { invoice } = JSON.parse(Buffer.from(params.request, "base64url").toString()).methodDetails;
const preimage = await payWithYourWallet(invoice);

const credential = Buffer.from(JSON.stringify({ challenge: params, payload: { preimage } })).toString("base64url");
const res = await fetch(url, { method: "POST", headers: { ...headers, Authorization: `Payment ${credential}` }, body });
console.log((await res.json()).nymbot, res.headers.get("payment-receipt"));

العملاء التي تم بناءها mppx مع طريقة الضوء تتعامل مع تحدي الدفع نفسها؛ توجيههم إلى النقطة النهائية ويسمح لهم بدفعها.

فيديوهات

و المدفوعات POST /videos الإجابة 202 على سبيل المثال، على سبيل المثال، a status_url: GET لا توجد أي مفتاح لمتابعة العمل.إنها مرسومة وتعمل لمدة 24 ساعة، طالما يتم الحفاظ على العمل.

{
  "id": "vid_...",
  "status": "in_progress",
  "status_url": "https://nymbot.ai/api/v1/videos/vid_...?exp=1790000000&sig=...",
  "nymbot": {
    "payment": "l402", "tier": "pro", "paid_sats": 4800, "charged_sats": 4800,
    "refund_token": "REFUND-5E0B..."
  }
}

الحفاظ على refund_token في هذه الحالة، يجب أن يكون هناك أي إشارة إلى أن هذه الفيديوهات (GET /api/v1/l402/refunds الإجابة "status": "pending"( )؛ إذا لم يكن التقديم غير مبالغ فيه، فإن الدفع يقع على ذلك. refund_sats للعمل المدفوع ولكن لا يلجأ أبدا إلى الورق، لذلك تشارك URL المستوى لا يشارك الورق.

استرداد

إذا لم يكن الطلب المدفوع ناجحًا، وإذا حصل على خدمة Nymbot على رسوم للحاجة، يتم الحفاظ على الدفع والخطأ يقول ذلك، مع charged_sats، كما هو الحال مع طلب مفتوح.إذا فشلت دون تقييم ، فإن الأخطاء تؤدي إلى إعادة تقييم تقييم قيمة ما تشتريه:

{
  "error": {
    "message": "The image generator failed. Nothing was charged. Please try again. The 237 sats you paid are on refund token REFUND-...",
    "type": "api_error",
    "code": "upstream_error",
    "refund_token": "REFUND-0C15DBED145D59131BA70298A413ADEB3D9B9AB082C476EA70A5BD38FCA5DE6D",
    "refund_sats": 237,
    "refund_expires_at": "2026-10-30T12:00:00.000Z"
  }
}

يتم العثور على أجزاء غير مستخدمة بطريقة مماثلة: إذا طلبت منك اثنين من الصور و لم تتم إلغاؤها، فإن إجابة النجاح nymbot يتناول الموضوع علامة استرداد لعدم وجودها؛ يتم تقييم الترجمة التي لا يمكن قراءتها أمامها لأطول فترة ممكنة من الملف (لا يزيد عن 30 دقيقة) ، ويعود الفرق في الطول الحقيقي ك علامة استرداد؛ إذا أظهرت أنها أطول من 30 دقيقة ، يتم رفضها مع 413 ويعود الدفع بأكملها.إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال إرسال

توقيع العائد هو رمز 256 بوصة عشوائي. Nymbot تخزين القذف فقط، وتنتهي بعد 30 يوما. إنه يحتوي على سعر معين، ويمكنك:

  • الدفع معها. إرسال Authorization: Bearer REFUND-… وَقَوْلُهُ تَعَالَى: {وَإِذْ قُلْنَا لِلْمَلاَئِكَةِ اسْجُدُواْ لآدَمَ فَسَجَدُواْ إِلاَّ إِبْلِيسَ أَبَى وَاسْتَكْبَرَ وَكَانَ مِنَ الْكَافِرِينَ} [البقرة: 34] .refund_token_sats في ال nymbot موضوع). تقييم قيمة أقل من الإجابة على الطلب 402 refund_insufficient· فشل غير مبرر يضع الأسهم مرة أخرى على نفس التوقيت.
  • تحقق ذلك GET /api/v1/l402/refunds مع نفس الرأس يعود {"sats": 237, "status": "open", "expires_at": "..."}.
  • يمكن استخدام نقطة واحدة أكثر من 60 مرة في الدقيقة.
  • قم بتحويلها إلى نيم. ارفعها في اشترى هدية في التطبيق Nymbot ، أو الاتصال POST /api/v1/l402/refunds/redeem مع a التوقيع التوقيع و {"refund_token": "REFUND-...", "balance": "standard"} (أو "pro"جميع الائتمان تذهب إلى الصفقات (10 سعر كل واحد على أساس ، 100 على Pro); سعر لا يجعل كمية كاملة من الائتمان على اليمين للطلبات API.

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