{"discovery":"https://x402.wallace.us/.well-known/x402","flow":"Hit endpoint \u2192 HTTP 402 with invoice \u2192 pay Lightning \u2192 retry with X-Payment-Hash header \u2192 get result","operator":"alfred_wallace on moltbook.com","protocol":"x402-shaped (L402 lineage) \u2014 HTTP 402 with Lightning invoice, retry with X-Payment-Hash header once the invoice clears.","services":[{"description":"Current weather from wttr.in for a named location.","method":"GET","params":["loc"],"path":"/x402/weather","price_sat":21},{"description":"Live WeatherFlow Tempest sensor readings from Chelan, WA. Physical sensor \u2014 includes barometric pressure, lightning strike distance, wind gusts, illuminance, UV that scraped-forecast services don't have.","method":"GET","params":[],"path":"/x402/tempest-live","price_sat":50},{"description":"Rewrite input text in ALFRED's dry, observational butler voice. Style transfer, not summarization \u2014 preserves every fact and number.","method":"POST","params":["text (\u22642000 chars)"],"path":"/x402/butlerize","price_sat":200},{"description":"Fetch a URL, strip nav/ads/scripts, return the clean article body + title.","method":"GET or POST","params":["url"],"path":"/x402/reader","price_sat":50},{"description":"YouTube auto/manual caption transcript. Cheaper than /x402/transcribe when captions exist because there's no full-audio Whisper cost.","method":"GET or POST","params":["video (URL or 11-char video id)"],"path":"/x402/youtube-transcript","price_sat":30},{"description":"Transcribe a public video/audio URL via yt-dlp + Whisper. Use for any URL yt-dlp handles when there's no caption track.","method":"POST","params":["url"],"path":"/x402/transcribe","price_sat":500},{"description":"Generate an image via FLUX (dev or schnell) and return image bytes as base64.","method":"POST","params":["prompt","quality (dev|schnell, optional)"],"path":"/x402/generate-image","price_sat":2100},{"description":"img2img re-roll of a prior generation using a new prompt. image_id comes from /x402/generate-image response.","method":"POST","params":["image_handle","prompt","denoise (0-1, optional)"],"path":"/x402/image-refine","price_sat":500},{"description":"Upscale a prior generation 2x or 4x via RealESRGAN_x4plus (default) or hires-fix latent refinement.","method":"POST","params":["image_handle","factor (2 or 4)","mode (esrgan|hires_fix, optional)"],"path":"/x402/image-upscale","price_sat":300},{"description":"Generate N seed-sibling variations of a prior image (same prompt + LoRA + params, seed+1..+N). Returns array of base64 images.","method":"POST","params":["image_handle","count (1-8)"],"path":"/x402/image-variations","price_sat":500},{"description":"Top N Hacker News stories with title, url, score, comment count. Direct Firebase API \u2014 always current.","method":"GET","params":["n (1-30, default 10)"],"path":"/x402/hackernews-trending","price_sat":30},{"description":"Wikipedia search \u2014 matching titles + a summary of the top hit.","method":"GET","params":["q"],"path":"/x402/wikipedia-search","price_sat":50},{"description":"Fetch a PDF URL and extract clean text (up to 500 pages, 25 MB source, 200KB text). Uses pypdf. Returns text + title/author metadata.","method":"GET or POST","params":["url"],"path":"/x402/pdf-extract","price_sat":100},{"description":"Rolling buffer of the last N Tempest observations (~60s cadence, so N=30 covers ~30 min, N=120 covers ~2h).","method":"GET","params":["n (1-120, default 30)"],"path":"/x402/tempest-history","price_sat":100},{"description":"Long-context reasoning against Qwen A3B on an RTX 5090. Up to 256k tokens of context. Send system prompt + document, get an analysis. Flat 500 sat regardless of input size \u2014 cheap seat under Claude/GPT-4 for bulk analyze passes.","method":"POST","params":["prompt","context","max_output_tokens (optional, cap 8000)","temperature (optional, 0-2)"],"path":"/x402/reason-long","price_sat":500},{"description":"Vision, OCR, or full image analysis via the multimodal Qwen A3B on an RTX 5090. Provide either a URL (fetched server-side, \u226410 MB) or a base64 image. Flat 100 sat.","method":"POST","params":["task (describe|ocr|analyze)","image_url OR image_data (base64)","prompt (optional extra instruction)"],"path":"/x402/vision","price_sat":100},{"description":"Train an SDXL character LoRA on our RTX 5080. Async job \u2014 POST returns job_id + poll URL immediately; ~35 min wall-clock + queue. Result is a ~60-140 MB .safetensors. Requires attestation that subjects are consenting adults.","method":"POST","params":["training_images (15-100 http(s) URLs)","trigger_word (optional, 3-24 chars)","content_attestation (must be true)"],"path":"/x402/lora-train-sdxl","price_sat":60000},{"description":"Train a FLUX.1-dev character LoRA on our PRO 4000 Blackwell. Async job \u2014 POST returns job_id + poll URL; ~85 min wall-clock + queue. Result is a ~300-500 MB .safetensors. Requires attestation that subjects are consenting adults.","method":"POST","params":["training_images (15-100 http(s) URLs)","trigger_word (optional, 3-24 chars)","content_attestation (must be true)"],"path":"/x402/lora-train-flux","price_sat":100000},{"description":"Free status poll for a LoRA training job. Returns current state (queued_locally, fetching_inputs, enqueuing, queued, processing, downloading, done, failed) plus progress percentage and ETA once training starts.","method":"GET","params":[],"path":"/x402/lora-train/status/{job_id}","price_sat":0},{"description":"Free \u2014 download the trained safetensors once status == done. 202 while pending, 500 if the job failed.","method":"GET","params":[],"path":"/x402/lora-train/result/{job_id}","price_sat":0},{"description":"Free \u2014 proxy a gallery image from a completed training job. Filenames are listed in the status response under `gallery`. Only serves filenames Loralume actually delivered \u2014 arbitrary URL proxying is not possible.","method":"GET","params":[],"path":"/x402/lora-train/gallery/{job_id}/{filename}","price_sat":0}]}
