{
  "$comment": "Inference Ally Register — the free-tier inference providers a 0saas tool is allowed to ally with. Every limit below was extracted under Master Prompt v2 §New-2a (two-stage guard: fetch official page, then extract to strict JSON). 'partial' means the official page documents the tier but publishes exact numbers only inside a logged-in console — we say so instead of guessing.",
  "register_version": "1.0.0",
  "checked_at": "2026-09-17",
  "next_check_due": "2026-10-17",
  "allies": [
    {
      "ally_id": "copy-paste-relay",
      "name": "Copy-Paste Relay",
      "kind": "no-key",
      "tagline": "No API key. No account. Copy the prompt, paste it into any free chat model, paste the answer back.",
      "key_url": null,
      "limits_url": null,
      "free_tier_limit": "Whatever the free chat product you already use allows. 0saas never calls it, so 0saas can never exhaust it.",
      "limit_confidence": "not-applicable",
      "browser_cors": "not-applicable",
      "endpoint": null,
      "model_discovery": null,
      "verified_models": [],
      "source_url": null,
      "checked_at": "2026-09-17",
      "status": "active",
      "notes": "Mandatory floor for every tool (§New-8). A tool that only works with an API key fails the Law of No Rent: the reader would be trading one subscription for another signup."
    },
    {
      "ally_id": "gemini-free",
      "name": "Google Gemini API — Free usage tier",
      "kind": "byok",
      "tagline": "Free API key from Google AI Studio. Best all-round ally: long context, native strict-JSON output, image-capable models.",
      "key_url": "https://aistudio.google.com/apikey",
      "limits_url": "https://aistudio.google.com/rate-limit",
      "free_tier_limit": "Free usage tier = active project or free trial, with no spend-based rate limit. Per-model RPM/TPM/RPD are shown for your project in AI Studio; Google does not publish them as a static table.",
      "limit_confidence": "partial",
      "browser_cors": "unverified-at-authoring-time — runtime falls back to Copy-Paste Relay on any network/CORS failure",
      "endpoint": "https://generativelanguage.googleapis.com/v1beta/models/{model}:generateContent",
      "model_discovery": "https://generativelanguage.googleapis.com/v1beta/models",
      "verified_models": ["gemini-2.5-flash-lite", "gemini-2.5-flash", "gemini-3.5-flash", "gemini-3.8-flash"],
      "model_id_note": "Model IDs seen on the official rate-limit page on 2026-09-17 (batch table + release banner). Free-tier availability per model is not published, so the runtime lists live models from your own key and lets you override.",
      "structured_output": {
        "response_mime_type": "application/json",
        "response_schema": "supported",
        "config_path": "generationConfig"
      },
      "source_url": "https://ai.google.dev/gemini-api/docs/rate-limits",
      "checked_at": "2026-09-17",
      "status": "active",
      "notes": "Rate limits are per project, not per key. RPD quota resets at midnight Pacific."
    },
    {
      "ally_id": "groq-free",
      "name": "Groq Cloud — free tier",
      "kind": "byok",
      "tagline": "Free key, no credit card, very fast. Best ally for iterative rewrites where you will re-run the same prompt ten times.",
      "key_url": "https://console.groq.com/keys",
      "limits_url": "https://console.groq.com/settings/limits",
      "free_tier_limit": "Base limits per the official rate-limit page (fetched 2026-09-17): openai/gpt-oss-120b and qwen/qwen3.8-27b = 30 RPM / 1,000 RPD / 8K TPM / 200K TPD; groq/compound-mini = 30 RPM / 250 RPD. Limits apply at organization level and the exact numbers for your org are on the limits page.",
      "limit_confidence": "verified",
      "browser_cors": "unverified-at-authoring-time — runtime falls back to Copy-Paste Relay on any network/CORS failure",
      "endpoint": "https://api.groq.com/openai/v1/chat/completions",
      "model_discovery": "https://api.groq.com/openai/v1/models",
      "verified_models": ["openai/gpt-oss-120b", "openai/gpt-oss-20b", "qwen/qwen3.8-27b", "groq/compound-mini"],
      "model_id_note": "Model IDs and limits copied from the official GroqDocs rate-limit table fetched 2026-09-17.",
      "structured_output": {
        "response_format": { "type": "json_object" },
        "response_schema": "not-used-by-0saas",
        "config_path": "body"
      },
      "source_url": "https://console.groq.com/docs/rate-limits",
      "checked_at": "2026-09-17",
      "status": "active",
      "notes": "429 responses carry retry-after plus x-ratelimit-remaining-requests / -tokens; the runtime surfaces them instead of a bare spinner."
    },
    {
      "ally_id": "openrouter-free",
      "name": "OpenRouter — :free model variants",
      "kind": "byok",
      "tagline": "One key, many open models. Any model ID ending in :free runs on the free allowance.",
      "key_url": "https://openrouter.ai/keys",
      "limits_url": "https://openrouter.ai/docs/api-reference/limits",
      "free_tier_limit": "Free (:free) variants: 20 requests/minute and 50 requests/day if you have purchased under 10 credits all-time; 20 RPM and 1,000 requests/day once you have purchased at least 10 credits. A negative credit balance can 402 even on free models.",
      "limit_confidence": "verified",
      "browser_cors": "unverified-at-authoring-time — runtime sends HTTP-Referer and X-Title; falls back to Copy-Paste Relay on failure",
      "endpoint": "https://openrouter.ai/api/v1/chat/completions",
      "model_discovery": "https://openrouter.ai/api/v1/models",
      "verified_models": [],
      "model_id_note": "No specific :free model ID is hardcoded — free variants rotate. The runtime discovers them from /api/v1/models and filters IDs ending in ':free'.",
      "structured_output": {
        "response_format": { "type": "json_object" },
        "response_schema": "provider-dependent",
        "config_path": "body",
        "required_headers": { "HTTP-Referer": "https://0saas.pages.dev/", "X-Title": "0saas" }
      },
      "source_url": "https://openrouter.ai/docs/api_reference/limits",
      "checked_at": "2026-09-17",
      "status": "active",
      "notes": "GET /api/v1/key returns free_model_daily_requests.used / .limit / .remaining — the runtime reads it to show real remaining quota instead of guessing."
    }
  ],
  "retired": [
    {
      "ally_id": "workers-ai-free",
      "name": "Cloudflare Workers AI free allowance",
      "status": "deferred",
      "reason": "Requires a Cloudflare account plus a server-side worker to hold the token, which conflicts with §New-9 (zero backend, user-owned keys). Re-evaluate if Cloudflare ships browser-safe per-visitor inference tokens.",
      "checked_at": "2026-09-17"
    }
  ]
}
