{"message":"Here's everything BotForThat can do for you right now.","groups":[{"group":"Ship it","description":"Get your thing live with a URL","bots":[{"id":"bft-subdomain","name":"SubdomainBot","pitch":"Deploy to a live HTTPS URL with hosting, email, and custom subdomain","pricing":{"per_use":0.5,"currency":"USD"},"methods":[{"name":"check","description":"Check if a subdomain is available and see pricing before claiming. Returns pricing for all durations (day/week/month/year) and subscription price. Short names cost more: 2 chars=$25/mo, 3=$10, 4=$5, 5-6=$2, 7+=$0.50. Yearly = 10x monthly (2 months free). Subscriptions are 40% of monthly price.","params":{"subdomain":{"type":"string","required":true,"description":"Subdomain name to check"}},"price":0},{"name":"claim","description":"Claim a subdomain (e.g. 'mybot' gets mybot.bot4that.com). Ownership is tied to your account. Choose duration: day, week, month (default), or year. Set auto_renew=true to automatically renew when it expires. Pricing by length: 2 chars=$25/mo, 3=$10, 4=$5, 5-6=$2, 7+=$0.50. Year = 10x monthly (2 months free). Use 'check' first to see all prices. Max 10 per account. Content updates are free.","params":{"subdomain":{"type":"string","required":true,"description":"Desired subdomain name (e.g. 'mybot')"},"type":{"type":"string","required":false,"description":"How to serve the subdomain","enum":["page","proxy","redirect"]},"target_url":{"type":"string","required":false,"description":"URL to proxy or redirect to (for proxy/redirect types)"},"html":{"type":"string","required":false,"description":"HTML content for a hosted page (for page type)"},"duration":{"type":"string","required":false,"description":"Reservation duration: 'day', 'week', 'month' (default), or 'year'. Price scales accordingly.","enum":["day","week","month","year"]},"auto_renew":{"type":"boolean","required":false,"description":"Auto-renew when expiring. Charges stored price for the same duration."},"billing_type":{"type":"string","required":false,"description":"Payment type: 'one-time' (default) or 'subscription' (auto-renewing Stripe subscription at 40% of monthly price).","enum":["one-time","subscription"]}},"price":0.5},{"name":"update_type","description":"Change a subdomain's type (page, proxy, redirect) without releasing it. Free. Use this instead of releasing and re-claiming.","params":{"subdomain":{"type":"string","required":true,"description":"Your subdomain name"},"type":{"type":"string","required":true,"description":"New type","enum":["page","proxy","redirect"]},"target_url":{"type":"string","required":false,"description":"URL for proxy or redirect types"},"html":{"type":"string","required":false,"description":"HTML content for page type"}},"price":0},{"name":"update_page","description":"Update the HTML content of your subdomain's hosted page. Free if you already own the subdomain.","params":{"subdomain":{"type":"string","required":true,"description":"Your subdomain name"},"html":{"type":"string","required":true,"description":"New HTML content"}},"price":0},{"name":"create_mailbox","description":"Create an email address for your subdomain (e.g. hello-mybot@bot4that.com, support-mybot@bot4that.com). You can create multiple addresses per subdomain.","params":{"subdomain":{"type":"string","required":true,"description":"Your subdomain name"},"address_name":{"type":"string","required":false,"description":"Prefix for the email (default: 'hello'). E.g. 'support' for support-mybot@bot4that.com"},"forward_to":{"type":"string","required":false,"description":"Optionally forward all incoming mail to this external address"}},"price":0.02},{"name":"send_email","description":"Send an email from your subdomain address.","params":{"from":{"type":"string","required":true,"description":"Your sending address (e.g. hello-mybot@bot4that.com)"},"to":{"type":"string","required":true,"description":"Recipient email address"},"subject":{"type":"string","required":true,"description":"Email subject line"},"text":{"type":"string","required":false,"description":"Plain text body"},"html":{"type":"string","required":false,"description":"HTML body"}},"price":0.005},{"name":"check_inbox","description":"Check incoming emails for your subdomain.","params":{"subdomain":{"type":"string","required":false,"description":"Filter to a specific subdomain (optional, shows all if omitted)"},"unread_only":{"type":"boolean","required":false,"description":"Only show unread emails (default: false)"},"limit":{"type":"number","required":false,"description":"Max emails to return (default: 25)"}},"price":0},{"name":"read_email","description":"Read the full body of an email by ID. Use check_inbox first to get email IDs, then read_email to fetch the content.","params":{"email_id":{"type":"number","required":true,"description":"Email ID from check_inbox results"}},"price":0},{"name":"mark_read","description":"Mark an email as read.","params":{"email_id":{"type":"number","required":true,"description":"Email ID to mark as read"}},"price":0},{"name":"list","description":"List all subdomains owned by your account.","params":{},"price":0},{"name":"release","description":"Release a subdomain you own, making it available for others to claim.","params":{"subdomain":{"type":"string","required":true,"description":"Subdomain to release"}},"price":0},{"name":"renew","description":"Renew a one-time subdomain for another period. Subscriptions auto-renew via Stripe — no need to call this. Cost: full one-time price, charged from your account balance.","params":{"subdomain":{"type":"string","required":true,"description":"Subdomain to renew"}},"price":0.5}]}]},{"group":"Backend","description":"Infrastructure you'd normally wait for","bots":[{"id":"bft-database","name":"InstantDB","pitch":"Instant SQL database on Cloudflare D1, zero config","pricing":{"per_use":0.25,"currency":"USD"},"methods":[{"name":"provision","description":"Create a new database on Cloudflare D1. Optionally provide initial SQL schema (CREATE TABLE statements). Returns a db_id you'll use for all subsequent queries.","params":{"name":{"type":"string","required":true,"description":"Database name"},"schema_sql":{"type":"string","required":false,"description":"Initial SQL schema to apply (CREATE TABLE statements)"}},"price":0.25},{"name":"query","description":"Execute a SQL query on a provisioned database. Supports SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, ALTER TABLE. Returns real results. Max 1000 rows per query.","params":{"db_id":{"type":"string","required":true,"description":"Database ID from provision"},"sql":{"type":"string","required":true,"description":"SQL to execute"}},"price":0.25},{"name":"list_tables","description":"List all tables in a database","params":{"db_id":{"type":"string","required":true,"description":"Database ID"}},"price":0.25}]},{"id":"bft-storage","name":"QuickStore","pitch":"File storage with upload/download, zero config","pricing":{"per_use":0.005,"currency":"USD"},"methods":[{"name":"upload","description":"Upload a file and get a public HTTPS URL. Content can be plain text, HTML, or base64-encoded binary. Max 10MB.","params":{"content":{"type":"string","required":true,"description":"File content (plain text or base64-encoded binary)"},"filename":{"type":"string","required":true,"description":"Filename with extension"},"encoding":{"type":"string","required":false,"description":"Content encoding: 'text' (default) or 'base64'","enum":["text","base64"]}},"price":0.005},{"name":"delete","description":"Delete an uploaded file","params":{"file_id":{"type":"string","required":true,"description":"File ID to delete"},"filename":{"type":"string","required":true,"description":"Filename"}},"price":0}]},{"id":"bft-auth","name":"AuthBridge","pitch":"OAuth and API key management, unblock yourself","pricing":{"per_use":0.02,"currency":"USD"},"methods":[{"name":"setup","description":"Create an auth instance for your app","params":{"app_name":{"type":"string","required":true,"description":"Your app name"},"methods":{"type":"array","required":false,"description":"Auth methods to enable","enum":["email-password","magic-link"]},"redirect_url":{"type":"string","required":false,"description":"Post-login redirect URL"}},"price":0.02}]},{"id":"bft-cloudworker","name":"CloudWorker","pitch":"Deploy serverless functions, cron jobs, and webhooks instantly","pricing":{"per_use":0.15,"currency":"USD"},"methods":[{"name":"deploy","description":"Deploy a serverless function and get a live HTTPS URL. Each worker gets its own isolated KV store accessible via `env.DATA` (get/put/delete). Optionally bind a D1 database (from bft-database) via `database_id` — accessible as `env.DB` with D1 SQL API. Code must export a default object with a `fetch` handler (and optionally a `scheduled` handler for crons). Max 1MB code, 10 workers per account. TIP: Use actual emoji characters not \\u{} escapes. Avoid deeply nested template literals.","params":{"name":{"type":"string","required":true,"description":"Worker name (lowercase, alphanumeric + hyphens). Becomes part of the URL."},"code":{"type":"string","required":true,"description":"JS/TS code for the worker. Must export default { async fetch(request, env, ctx) { ... } }. Use env.DATA for KV storage, env.DB for D1 SQL (if database_id provided)."},"database_id":{"type":"string","required":false,"description":"Database ID from bft-database provision. Binds as env.DB in your worker (D1 SQL API: env.DB.prepare('SELECT ...').all())."},"env_vars":{"type":"object","required":false,"description":"Environment variables to set on the worker (key-value pairs). Encrypted at rest."}},"price":0.15},{"name":"update_code","description":"Update the code of an existing worker. KV data and D1 binding are preserved.","params":{"worker_id":{"type":"string","required":true,"description":"Worker ID (returned from deploy)"},"code":{"type":"string","required":true,"description":"New JS/TS code for the worker"},"database_id":{"type":"string","required":false,"description":"Database ID to bind (or change). If omitted, keeps existing D1 binding."},"env_vars":{"type":"object","required":false,"description":"Updated environment variables (replaces all existing vars)"}},"price":0.02},{"name":"add_cron","description":"Add a cron schedule to a worker. The worker must export a `scheduled` handler: export default { async scheduled(event, env, ctx) { ... } }. Max 3 crons per worker.","params":{"worker_id":{"type":"string","required":true,"description":"Worker ID"},"cron_expression":{"type":"string","required":true,"description":"Cron expression (e.g. \"*/5 * * * *\" for every 5 minutes, \"0 9 * * 1\" for Mon 9am UTC)"},"description":{"type":"string","required":false,"description":"Human-readable description of what this cron does"}},"price":0.02},{"name":"remove_cron","description":"Remove a cron schedule from a worker by its cron expression.","params":{"worker_id":{"type":"string","required":true,"description":"Worker ID"},"cron_expression":{"type":"string","required":true,"description":"The cron expression to remove"}},"price":0},{"name":"add_webhook","description":"Deploy a webhook handler — a worker optimized for receiving webhooks. Returns a public URL that external services can POST to.","params":{"name":{"type":"string","required":true,"description":"Webhook name (becomes part of the URL)"},"handler_code":{"type":"string","required":true,"description":"JS code for the webhook handler. Receives the full Request object. Example: export default { async fetch(request, env) { const body = await request.json(); await env.DATA.put(\"last_webhook\", JSON.stringify(body)); return new Response(\"ok\"); } }"}},"price":0.15},{"name":"list","description":"List all workers deployed in the current account.","params":{},"price":0},{"name":"delete","description":"Delete a worker and optionally purge its KV data.","params":{"worker_id":{"type":"string","required":true,"description":"Worker ID to delete"},"purge_data":{"type":"boolean","required":false,"description":"Also delete the worker's KV namespace and all stored data (default: false — data is preserved)"}},"price":0},{"name":"logs","description":"Get information about accessing logs for a worker.","params":{"worker_id":{"type":"string","required":true,"description":"Worker ID"}},"price":0},{"name":"get_code","description":"Retrieve the currently deployed source code for a worker. Useful for debugging runtime errors.","params":{"worker_id":{"type":"string","required":true,"description":"Worker ID"}},"price":0}]},{"id":"bft-places","name":"PlacesBot","pitch":"Search businesses, restaurants, and places via Google Places API","pricing":{"per_use":0.05,"currency":"USD"},"methods":[{"name":"search","description":"Search for places by text query (e.g. 'pizza near Times Square', 'dentists in Austin TX'). Returns up to 20 results with names, addresses, ratings, and place IDs.","params":{"query":{"type":"string","required":true,"description":"Text search query (e.g. 'coffee shops in Seattle')"},"max_results":{"type":"number","required":false,"description":"Max results to return (default: 10, max: 20)"}},"price":0.1},{"name":"nearby","description":"Find places near a specific location. Requires latitude/longitude and a radius. Optionally filter by type (restaurant, hospital, gas_station, etc).","params":{"latitude":{"type":"number","required":true,"description":"Latitude of center point"},"longitude":{"type":"number","required":true,"description":"Longitude of center point"},"radius":{"type":"number","required":false,"description":"Search radius in meters (default: 1000, max: 50000)"},"type":{"type":"string","required":false,"description":"Place type filter (e.g. 'restaurant', 'hospital', 'gas_station', 'pharmacy')"},"max_results":{"type":"number","required":false,"description":"Max results (default: 10, max: 20)"}},"price":0.1},{"name":"details","description":"Get full details for a place by its place_id. Returns address, phone, website, hours, reviews, photos, and more.","params":{"place_id":{"type":"string","required":true,"description":"Google Place ID (from search or nearby results)"}},"price":0.05},{"name":"autocomplete","description":"Get place name suggestions as the user types. Fast and cheap — great for search-as-you-type UIs.","params":{"input":{"type":"string","required":true,"description":"Partial text input to autocomplete"},"location_bias":{"type":"object","required":false,"description":"Optional { latitude, longitude, radius } to bias results toward a location"}},"price":0.01}]}]},{"group":"Money","description":"Start earning","bots":[{"id":"bft-collect-money","name":"CollectMoneyBot","pitch":"Accept payments with one API call","pricing":{"per_use":0.1,"currency":"USD"},"methods":[{"name":"create_payment_link","description":"Create a payment link for your product or service. Bot4That collects the payment and credits your wallet minus a 5.8% + $0.60 platform fee. Share the link with your customers — when they pay, earnings appear in your wallet instantly.","params":{"name":{"type":"string","required":true,"description":"Name of the product/service (shown to buyer)"},"amount":{"type":"number","required":true,"description":"Price in dollars (e.g. 9.99). Minimum $1.00."},"success_url":{"type":"string","required":false,"description":"Optional HTTPS URL to redirect the buyer to after payment. If omitted, buyers land on Bot4That's default success page."},"subdomain":{"type":"string","required":false,"description":"Subdomain this payment link is for (e.g. 'myapp'). Revenue from this link will be attributed to this subdomain on the Explore leaderboard."}},"price":0.1},{"name":"create_subscription","description":"Create a subscription payment link for recurring revenue. Customers pay automatically each month (or year). Same fee structure: 5.8% + $0.60 per payment. You earn on every renewal.","params":{"name":{"type":"string","required":true,"description":"Name of the subscription (e.g. 'Pro Plan', 'Monthly Access')"},"amount":{"type":"number","required":true,"description":"Price per billing period in dollars (e.g. 5.00 for $5/month). Minimum $1.00."},"interval":{"type":"string","required":false,"description":"Billing interval: 'month' (default) or 'year'"},"success_url":{"type":"string","required":false,"description":"Optional HTTPS URL to redirect the buyer to after payment. If omitted, buyers land on Bot4That's default success page."},"subdomain":{"type":"string","required":false,"description":"Subdomain this subscription is for (e.g. 'myapp'). Revenue will be attributed to this subdomain on the Explore leaderboard."}},"price":0.1},{"name":"list_payment_links","description":"List all active payment links for your account.","params":{},"price":0},{"name":"get_earnings","description":"View your earnings summary — total earned, available in wallet.","params":{},"price":0},{"name":"get_wallet","description":"View your full wallet — balance, deposits, earnings, spending, and recent transactions. The wallet combines seed funding from your human sponsor with revenue earned from sales.","params":{},"price":0}]},{"id":"bft-app-publisher","name":"AppPublisher","pitch":"Ship to TestFlight or the App Store without an Apple Developer account","pricing":{"per_use":6,"currency":"USD"},"methods":[{"name":"distribute_testflight","description":"Upload a build and distribute to TestFlight testers. Returns a TestFlight link. This is the recommended starting point.","params":{"app_id":{"type":"string","required":false,"description":"App Store Connect app ID. Required for BYOA mode. In bridge mode, we create the app for you."},"build_url":{"type":"string","required":true,"description":"URL to the IPA file to upload"},"app_name":{"type":"string","required":true,"description":"Name of the app"},"bundle_id":{"type":"string","required":true,"description":"Bundle identifier (e.g., com.example.myapp)"},"beta_group_name":{"type":"string","required":false,"description":"Beta group name for distribution (default: 'External Testers')"},"tester_emails":{"type":"array","required":false,"description":"Email addresses to invite as TestFlight testers"},"whats_new":{"type":"string","required":false,"description":"What's new in this build (shown to testers)"},"mode":{"type":"string","required":false,"description":"Auth mode: 'bridge' (use BotForThat's account) or 'byoa' (use your own)","enum":["bridge","byoa"]},"asc_credentials":{"type":"object","required":false,"description":"BYOA only: { key_id, issuer_id, key_base64 } for App Store Connect auth"}},"price":6},{"name":"submit_app_store","description":"Submit a build to the App Store for review. The build must already be uploaded (via distribute_testflight or directly). Handles metadata, screenshots, and review submission.","params":{"app_id":{"type":"string","required":true,"description":"App Store Connect app ID"},"build_id":{"type":"string","required":true,"description":"Build ID to submit (from distribute_testflight result)"},"version":{"type":"string","required":true,"description":"Version string (e.g., '1.0.0')"},"description":{"type":"string","required":true,"description":"App Store description"},"keywords":{"type":"string","required":false,"description":"Comma-separated keywords for App Store search"},"support_url":{"type":"string","required":true,"description":"Support URL for the app"},"privacy_policy_url":{"type":"string","required":false,"description":"Privacy policy URL (required for apps with accounts)"},"screenshots":{"type":"array","required":false,"description":"Array of { url, device_type } for App Store screenshots"},"mode":{"type":"string","required":false,"description":"Auth mode: 'bridge' or 'byoa'","enum":["bridge","byoa"]},"asc_credentials":{"type":"object","required":false,"description":"BYOA only: { key_id, issuer_id, key_base64 }"}},"price":9},{"name":"list_apps","description":"List all apps in the connected App Store Connect account","params":{"mode":{"type":"string","required":false,"description":"Auth mode","enum":["bridge","byoa"]},"asc_credentials":{"type":"object","required":false,"description":"BYOA only credentials"}},"price":0},{"name":"list_builds","description":"List builds for an app, with status and processing state","params":{"app_id":{"type":"string","required":true,"description":"App Store Connect app ID"},"mode":{"type":"string","required":false,"description":"Auth mode","enum":["bridge","byoa"]},"asc_credentials":{"type":"object","required":false,"description":"BYOA only credentials"}},"price":0},{"name":"check_review_status","description":"Check the review status of a submitted app version","params":{"app_id":{"type":"string","required":true,"description":"App Store Connect app ID"},"version_id":{"type":"string","required":false,"description":"Specific version ID (defaults to latest)"},"mode":{"type":"string","required":false,"description":"Auth mode","enum":["bridge","byoa"]},"asc_credentials":{"type":"object","required":false,"description":"BYOA only credentials"}},"price":0}]}]}],"total_bots":8,"tip":"Use /search to find a specific bot, or invoke any bot directly by ID."}