सामग्रीवर जा
Nymbot वर परत

ज्ञानाचा आधार विकासक

संतुलन, शीर्षक आणि कुंजी

आपल्याकडे काय आहे ते बघा, Lightning वर उतरवा, स्वतःच्या वॉलेटमधून स्वयंचलितपणे उतरवा, प्रत्येक मागणीची किंमत कशी बघा, आणि कोडमधून चाचण्यांचे प्रबंधन करा.

संतुलन नियंत्रण

तुमची दोन्ही शिल्लक, आणि या किल्लीच्या कॅपचा किती वापर केला जातो.

GET https://nymbot.ai/api/v1/credits/balance API चाचणीची गरज आहे. POST ते काम करतात, ग्राहकांसाठी ते काम करतात.

balance या दोन्ही बाजूंना एकत्रितपणे डॉलरमध्ये वर्तमान बिटकॉइन किंमतीत आहे, जे उपकरणे एकच संख्याची अपेक्षा करतात (null शेवटी क्रेडिट आणि 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);

देयक पद्धती

तुम्ही कसे करू शकता, आणि सीमा. Lightning एकच पद्धत आहे.

GET https://nymbot.ai/api/v1/topup/payment-methods - चावीची गरज नाही.

एक टॉप-अप 10 ते 1,000,000 टॉप-अप आहे; एक प्रो टॉप-अप कमीत कमी एक प्रो क्रेडिट विकत घेणे आवश्यक आहे, म्हणून तो 100 टॉप-अपपासून सुरू असतो. bulk_bonus मोठ्या टॉप-अपवर अतिरिक्त क्रेडिट, ऐपमध्ये समान: 10%, 15% किंवा 20% 500, 1,000 किंवा 5,000 टॉप-अपच्या मानक टॉप-अपवर आणि 5,000, 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यासाठी एक संपूर्ण संख्या.
currencyस्ट्रिंगनाहीSATS (उपयोगी वारंवार) USD या BTCसध्याच्या बिटक्वाइनच्या किंमतीनुसार डॉलरचे रुपांतर केले जाते.
tierस्ट्रिंगनाहीpro (उपयोगी वस्तू) या standard: क्रेडिट कोणत्या शिल्लककडे जाते.

एक मानक क्रेडिट 10 sats आणि एक प्रो क्रेडिट 100 sats आहे, प्लस कोणत्याही बोनस बोनस; credits त्यातून काय साध्य होईल हे सांगता येईल.

प्रतिक्रिया

{
  "invoice_id": "b7d41e0c95a2f38e6c1d0e9a4b7f2c61d3e8a05f9b2c4d7e1a6f3b8c0d5e2a9f4",
  "payment_request": "lnbc100u1p5...",
  "amount_sats": 10000,
  "credits": 115,
  "tier": "pro",
  "expires_at": "2026-09-30T09:27:00Z",
  "status": "pending"
}
स्थिती.कधी
400या प्रकल्पाचे मार्गदर्शक (unsupported_method) अज्ञात मुद्रा (unsupported_currency) किंवा वर्ग, कमीत कमी किंमत किंवा कमीत कमी किंमत (amount_too_small१ लाख रुपयांपेक्षा (amount_too_large) या कागदपत्राचे निषेध (amount_out_of_range).
429या प्रकरणाच्या तारखेला सुमारे ६० कोटी रुपयांची कमाई झाली आहे (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);

टॉप-अप तपासत आहे

चलन दिले गेले आहे का हे विचारते आणि एकदा ते मिळाले की त्यात क्रेडिट जोडले जाते. तपासणे म्हणजे ते क्रेडिट आहे, म्हणून पैसे भरल्यानंतर स्थिती तपासा 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
}
स्थिती.कधी
400हा 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 )नाहीदरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाढीच्या दरवाजाच्या दरवाढीच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवाजाच्या दरवा
start_date
end_date
तेंडुलकर (आणि कवी)नाहीISO 8601 तारीख किंवा वेळ.
modelतेंडुलकर (आणि कवी)नाहीफक्त हा मॉडेल.
typeतेंडुलकर (आणि कवी)नाहीchat, responses, messages, image, video, speech, transcription या embedding.
all_keysबूलियन (प्रश्न)नाहीएक कुंजी : true प्रत्येक कुंजी एकाच नामांकित आहे. 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);

खात्यात हस्ताक्षर करण्याची मागणी

किल्ली तयार करणे, बदलणे आणि रद्द करणे, खात्याचा सारांश आणि स्वयंचलित टॉप-अप हे ए. पी. आय. किल्ली घेत नाहीत. ते तुमच्या एन. आय. एम. कडून स्वाक्षरी घेतात, त्यामुळे गळती झालेली किल्ली त्याच्या कमाल मर्यादेपर्यंत खर्च करू शकते परंतु ती कधीही दुसरी किल्ली बनवू शकत नाही किंवा स्वतःची कमाल मर्यादा वाढवू शकत नाही.

ऐप तुमच्यासाठी हे करतो: सर्वकाही आग यासाठी तुम्हाला फक्त तुमच्या स्वतःच्या कोडमधून कुंजी प्रबंधित करण्याची गरज आहे.

हा हस्ताक्षर 27235 (NIP-98) प्रकारचा एक Nostr घटना आहे, जे base64-कोडमध्ये पाठविले जाते. 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 आहे, अनुरोध श्रृंखला समावेश, पूर्णपणे पाठविण्यात आलेला आहे.
  • method ही HTTP पद्धत आहे.
  • payload हे SHA-256 आहे, हेक्समध्ये, कच्चे अनुरोध शरीराचे. POST आणि PATCHआणि तुम्ही पाठवलेल्या शरीराला तुम्ही हॅश केलेला एक बाइटसाठी बाइट असणे आवश्यक आहे.
  • created_at सर्वरच्या घरातून ६० सेकंदांच्या आत असणे आवश्यक आहे.
  • प्रत्येक घटना एकाच वेळी काम करतो, a GET त्यानुसार, या प्रकरणातील एक नवीन अनुप्रयोग तयार करण्यात येणार नाही, तर प्रत्येक प्रकरणी एक नवीन अनुप्रयोग तयार करण्यात येणार आहे. nonce एकाच सेकंदात हस्ताक्षर केलेल्या दोन अनुरोध अजूनही वेगवेगळे असतील.
  • एक हस्ताक्षरित अनुरोधचे शरीर अधिकतम 64 KB असू शकते, आणि एक शरीर आवश्यक आहे Content-Type: application/json.

हरवलेली घटना परत येते 401 missing_nostr_auth; खराब आकारले आहे, खराब हस्ताक्षर केले आहे, खूप जुनी आहे, किंवा वेगवेगळ्या URL, पद्धती किंवा शरीराला परतते. invalid_nostr_auth, संदेशातील कारणासह; पुन्हा वापरलेला परत येतो nostr_auth_replayedएक एपीआय कुंजी पाठविण्यात आलेली आहे हे अस्वीकार केले जाते. हस्ताक्षर वाचण्यापूर्वी चेक केला जातो, आणि प्रत्येक पत्ता मिनिटाला 30 वेळा चूक करू शकतो (एक IPv6 पत्ता पूर्ण /64); त्यानंतर तो मिळतो. 429 सोबत Retry-After.

या ठिकाणांमधून ही बाजारातल्या अन्नपदार्थांची (https://nymbot.ai, https://nymchat.app आणि त्यांचे उपडोमेन). इतर कोणत्याही संकेतस्थळावरील पृष्ठाला सी. ओ. आर. एस. हेडर परत मिळत नाहीत, त्यामुळे ते काय परत करतात ते वाचू शकत नाहीत. स्क्रिप्ट्स आणि मूळ एप्स, जे नाही पाठवतात Originत्यांना प्रभावित होत नाही.

तुमचा गुप्त कुंजी

हस्ताक्षर करण्यासाठी तुमच्या नामाच्या गुप्त कुंजीची गरज (The Secret Key of Your Nym) nsec) जे सर्वकाही नियंत्रित करतात: तुमचा पहचान, तुमचा इतिहास आणि तुमचा संतुलन. फक्त आपण विश्वास ठेवलेल्या मशीनवर एक स्क्रिप्टमध्ये ठेवा, पर्यावरणातून वाचून ते फाइलमध्ये लिहिण्यापेक्षा, आणि आपण करू शकतो तेव्हा ऐप आवडते.

हे सहाय्यक हेडर्ड तयार करतात. या पृष्ठच्या नंतरच्या उदाहरणे त्यांना वापरतात. ते हेक्समध्ये गुप्त कुंजी वाचतात. NOSTR_SECRET_HEXयाचा वापर CURL One वापरतो. नॅक या प्रकरणाचा अर्थ असा आहे की, ‘NSSEC’ किंवा ‘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");
}

खाते संक्षिप्त

अॅपचे एपीआय पत्रक शीर्षस्थानी काय दर्शवितेः तुमची सार्वजनिक किल्ली, दोन्ही शिल्लक, किती किल्ली सक्रिय आहेत (रद्द किंवा कालबाह्य नाहीत) आणि स्वयंचलित टॉप-अप मांडणी, किंवा 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());

कुंजी नियंत्रण

एपच्या मुख्य यादीमागील अंतिम बिंदू. त्या सर्वांना एक गरज आहे अनुरोध हस्ताक्षरप्रत्येक कुंजी या फॉर्ममध्ये परतली जाते, आईएसओ 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बूलियन (प्रश्न)नाहीरद्द केलेल्या किल्ली समाविष्ट करा. पूर्वनिर्धारीत 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अस्तित्वातनाहीमात्र, त्यांची किंमत कमी होत नाही, तर 1 कोटी रुपये खर्च होत नाही.
reset_periodस्ट्रिंगनाहीdaily, weekly या monthly. गरज आहे. limit_satsत्यासाठी एक टोपी द्या, जे कधीच पुनर्वसन करू शकत नाही.
expire_atस्ट्रिंग किंवा इंटरेजनाहीजेव्हा कुंजी काम करीत नाही: एक 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 ची पूर्ण संख्या नसलेली कॅप; कॅपशिवाय रीसेट कालावधी; भूतकाळात कालबाह्य; अज्ञात क्षेत्र (unknown_parameter); किंवा 25 सक्रिय कुंजी आतापर्यंत (too_many_keys).
429या संदर्भातील ६० टक्के लोकांनी या संदर्भातील ६० टक्के लोकांना (rate_limit_exceededआणि साथ Retry-After).

cURL

URL=https://nymbot.ai/api/v1/keys
BODY='{"name":"laptop scripts","limit_sats":20000,"reset_period":"monthly"}'
curl "$URL" \
  -H "Authorization: $(nostr_auth POST "$URL" "$BODY")" \
  -H "Content-Type: application/json" \
  -d "$BODY"

Python

import json
import requests

url = "https://nymbot.ai/api/v1/keys"
body = json.dumps({"name": "laptop scripts", "limit_sats": 20000, "reset_period": "monthly"}).encode()
res = requests.post(
    url,
    data=body,
    headers={"Authorization": nostr_auth("POST", url, body), "Content-Type": "application/json"},
)
print(res.json()["data"]["key"])

JavaScript

const url = "https://nymbot.ai/api/v1/keys";
const body = JSON.stringify({ name: "laptop scripts", limit_sats: 20000, reset_period: "monthly" });
const res = await fetch(url, {
  method: "POST",
  headers: { "Authorization": nostrAuth("POST", url, body), "Content-Type": "application/json" },
  body,
});
console.log((await res.json()).data.key);

एक कुंजी वाचून

GET https://nymbot.ai/api/v1/keys/{id} हस्ताक्षर करा

परतावा {"data": {…}} चाचणीचा विषय, किंवा 404 key_not_found जर तुमचा कुंजीला हा आयडी नव्हता.

cURL

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

Python

import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.get(url, headers={"Authorization": nostr_auth("GET", url)}).json()["data"])

JavaScript

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

किल्ली बदलत आहे

PATCH https://nymbot.ai/api/v1/keys/{id} हस्ताक्षर करा

यापैकी काहीही पाठवा. name, limit_sats, reset_period आणि expire_atत्याचबरोबर एकच नियम, एकच चाचणी करतात. null मर्यादा नाही, पुनर्संचयित नाही, कालबाह्यता नाही. पुनर्संचयित कालावधी बदलल्याने शून्यावर नवीन कालावधी सुरू होतो. रद्द केलेली किल्ली बदलली जाऊ शकत नाही (400 key_revoked) परत {"data": {…}} अद्यतनित मुख्य वस्तू.

cURL

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

Python

import json
import requests

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

JavaScript

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

किल्ली मागे घेत आहे

DELETE https://nymbot.ai/api/v1/keys/{id} हस्ताक्षर करा

चावी एकाच वेळी थांबवते, चांगल्यासाठी. ती सोबत असलेल्या यादीत राहते revoked_at निवृत्ती, आणि ते दिसून येते include_revoked=trueजेव्हा एक कुंजी रद्द करण्यात आली आहे, तेव्हा फक्त नवीनतम ५० कुंजी रद्द करण्यात आली आहेत; जुन्या कुंजी रद्द केल्यानंतर अन्य कुंजी रद्द करण्यात आली आहे.

प्रतिक्रिया

{ "data": { "id": "4f0c9a1be27d3856", "revoked": true } }

cURL

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

Python

import requests

url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856"
print(requests.delete(url, headers={"Authorization": nostr_auth("DELETE", url)}).json())

JavaScript

const url = "https://nymbot.ai/api/v1/keys/4f0c9a1be27d3856";
const res = await fetch(url, { method: "DELETE", headers: { "Authorization": nostrAuth("DELETE", url) } });
console.log(await res.json());

NWC ऑटो-टॉप

लाईटनिंग वॉलेटला नॉस्टर वॉलेट कनेक्टशी जोडा आणि जेव्हा ए. पी. आय. खर्च कमी होतो तेव्हा निम्बॉट स्वतःच शिल्लक वाढवतो. एपच्या ए. पी. आय. पत्रकामध्ये समान सेटिंग्ज असतात; हे त्यामागील अंतिम बिंदू आहेत. त्या सर्वांना एक संतुलन आवश्यक आहे. स्वाक्षरी केलेली विनंती.

हे कसे कार्य करते: एक एपीआय अनुरोध बघण्यासाठी निवडलेल्या संतुलनवर चार्ज केल्यानंतर, जर त्या संतुलनने आपल्या ताबडतोबपेक्षा कमी पडले तर, Nymbot आपल्या टॉप-अप आकारसाठी एक चाचणी करतो, त्यासाठी तुमचा पर्स भुगतान करण्याची मागणी करतो आणि क्रेडिट वाढते. हे प्रत्येक 5 मिनिटाला एकदा चार्ज करतो आणि संतुलन कमी करतो, म्हणून मागण्यांची एक विस्फोट पर्स काढू शकत नाही. अॅपमध्ये खर्च करतो तो उघडत नाही. शेवटची टॉप-अपची वेळ आणि आकार, शेवटची त्रुटी, सेटिंग्समध्ये आहेत; जर एक भुगतान चूक झाल्यानंतर गेली तर त्याची चाचणी चेक करा. टॉप-अप स्थिती त्याला श्रेय द्या.

प्लॅनिंग करताना प्लॅनिंग करा

एक कनेक्शन श्रृंखला जे कोणालाही त्याच्यावर ठेवते त्याने तुमच्या पोर्टफोलियोला भुगतान करण्यास सांगितले जाते. Nymbot त्याला एन्क्रिप्टेड ठेवतो आणि फक्त कधीच त्याच्या स्वतःच्या टॉप-अप बिल भुगतान करण्यासाठी वापरतो, परंतु फक्त यासाठी एक कनेक्शन करा, आपल्या पोर्टफोलियोमध्ये एक खर्च बिल, म्हणून सर्वात जास्त तो कधीच भुगतान करू शकतो एक संख्या तुम्ही निवडला आहे. pay_invoice.

पाकीट जोडत आहे

POST https://nymbot.ai/api/v1/nwc-auto-topup/connect हस्ताक्षर करा

मैदान.प्रकारआवश्यकवर्णन.
nwc_urlस्ट्रिंगहोयकनेक्शन चाचणी, सुरुवात nostr+walletconnect://Nymbot पगारवाढ मागतो get_info त्यापूर्वी त्याने त्याचे रक्षण केले आणि त्याने त्याचे रक्षण केले.
threshold_satsअस्तित्वातहोयमात्र, त्यापैकी काही जणांना ही किंमत कमी झाली तर त्यापैकी काही जणांना 1000 रुपये कमी झाले.
topup_satsअस्तित्वातहोयप्रत्येक वेळी किती खर्च करावे, 1000 ते 1000 रुपये खर्च करावे.
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); संपर्कांची किंमत भरू शकत नाही (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());

चावीशिवाय प्रत्येक विनंतीसाठी पैसे भरणे

की, खाते नाही आणि शिल्लक नाही अशा विजेच्या एका वेळी एका विनंतीसाठी निश्चित-किंमत अंतिम बिंदू दिले जाऊ शकतातः POST /images/generations, POST /images/edits, POST /videos, POST /audio/speech, POST /audio/transcriptions, POST /audio/translations आणि POST /embeddings. गप्पा, प्रतिसाद आणि संदेशांना नेहमी किल्लीची आवश्यकता असते. किल्ली असलेल्या विनंतीचे बिल नेहमीप्रमाणे शिल्लक जमा केले जाते; जेव्हा किल्ली पाठवली जात नाही तेव्हाच देयक प्रवाह सुरू होतो.

Nymbot एकच विचार दोन संस्करण बोलत आहे, एका बैकेंडपासून: Lightning Labs ' ४४२ (त्याच्या जुन्या नावानेही स्वीकारले जाते, LSAT) आणि आय. ई. टी. एफ. चा मसुदा भरणा. HTTP Authentication चा वापर lightning पद्धती आणि charge याचा अर्थ आहे, आपल्या ग्राहकाला काय समजते ते वापरून घ्या.

स्वतःचे सर्वर चालवणे

चाचणीशिवाय भुगतान करताना फक्त जेव्हा API_L402_SECRET यापैकी 32 बाइट्स हे हेक्स (64 वर्ण) किंवा base64 (64 वर्ण) म्हणून ठेवतात. openssl rand -hex 32एक छोटा किंवा अनुमान योग्य किंमत सुविधा बंद करतो आणि कारण लॉग करतो. API_L402_SECRET_PREVIOUS एका दिवसासाठीः प्रमाणपत्रे, स्थिती यू. आर. एल. आणि त्याअंतर्गत केलेली आव्हाने त्यांची मुदत संपेपर्यंत काम करत राहतात.

समस्या

अनुरोध पाठवणे नको Authorization हेडरेटर: जर ते वैध असतील तर काहीच चालत नाही आणि तुम्ही 402 Payment Required एकच किंमत एक कुंजी देईल, 10 sats एक मानक क्रेडिट किंवा 100 sats एक प्रो क्रेडिट मध्ये रूपांतरित आणि एक संपूर्ण sat (कमून 1 sat, आणि कमीत कमीत कमी 0.05 क्रेडिट कमी). 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 समस्यांवर एक संपूर्ण काप आहे; एक अनुरोध सोडला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला गेला नाही. 429 सोबत Retry-Afterमुख्य भाग वाचण्यापूर्वी पाठवला जातो. किल्ली किंवा ओळखपत्राशिवाय कॉल केलेले सशुल्क अंतिम बिंदू देखील प्रत्येक पत्त्यासाठी एका मिनिटाला 120 अप्रमाणित विनंत्यांच्या सामान्य मर्यादेपर्यंत मोजले जातात. मुख्य भाग वाचण्यापूर्वी एक ओळखपत्र तपासले जाते आणि ज्याची विनंती Content-Type नाही आहे application/json या multipart/form-data यावर अटक करण्यात आली होती. 415 कधीच न मिळाल्याची खात्री.

इम्बेडमेंट्स मध्ये टोकनच्या अनुमानानुसार किंमत केली जाते, 1.5 वेळा मार्जिनसह, कारण वास्तविक संख्या नंतरच ओळखली जाते. परतावा टोकन.

भुगतान पाठवणे

कोणत्याही लॅटिन प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग प्लॅनिंग.

योजनाहेडर
४४२Authorization: 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 with the challenge id, भुगतान हॅश as) 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विश्वासार्हता चुकीची आहे, निंबॉटने जारी केल्यानंतर ती बदलली गेली आहे, किंवा निंबॉटने कधीही चलन जारी न केलेल्या देयक हॅशचे नाव दिले आहे. निंबॉटला माहित नसलेली कॅव्हेट असलेली मॅकरून, किंवा परस्परविरोधी कॅव्हेटसह, नाकारली जाते.
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 चावी असल्यासारखे, अधिक अ 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 परत मिळालेल्या नोकरीसाठी पण टोकन कधीच नाही, म्हणून स्टेट यूआरएल साझा करताना रिफंड साध्य होत नाही.

पुनरावृत्ती

जर सशुल्क विनंती अयशस्वी झाली आणि पुरवठादाराने प्रयत्नासाठी निम्बॉटला बिल दिले, तर पैसे ठेवले जातात आणि त्रुटी असे म्हणते, 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 आणि संपूर्ण भुगतान परत येते. Embeddings परत जे अनुमान ठेवण्यात आले आहे. एक विसर्जित व्हिडिओ परत पाठविण्यात आलेला टोकन वापरा.

रिफंड टोकन हा एक यादृच्छिक 256-बिट कोड आहे. निंबॉट केवळ त्याचा हॅश संचयित करतो आणि तो 30 दिवसांनंतर कालबाह्य होतो. त्यात सॅट शिल्लक असते आणि तुम्ही हे करू शकताः

  • त्यासाठी खर्च करा. पाठवा. Authorization: Bearer REFUND-… मात्र, त्याचबरोबरच या प्रकल्पाची सुरुवात झालेली नाही, असेही ते म्हणाले.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 प्रोवर); 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 } }