{
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-09",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.4",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "tool": {
    "slug": "fish-audio-tts",
    "name": "Fish Audio TTS API",
    "vendor": "Fish Audio",
    "vendorUrl": "https://fish.audio",
    "kind": "model",
    "category": "text-to-speech",
    "summary": "Fish Audio's API turns text into speech with the `s2.1-pro` model in 83 languages, over a REST endpoint, a timestamped stream and a WebSocket that accepts text as it is produced.",
    "url": "https://www.anchorterminal.com/tools/fish-audio-tts",
    "markdownUrl": "https://www.anchorterminal.com/tools/fish-audio-tts.md",
    "slimMarkdownUrl": "https://www.anchorterminal.com/tools/fish-audio-tts.min.md",
    "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/fish-audio-tts.json",
    "repo": "https://github.com/fishaudio/fish-audio-python",
    "license": "Apache-2.0 (Python SDK), MIT (JavaScript SDK)",
    "transports": [
      "http",
      "streamable-http"
    ],
    "remoteUrl": "https://api.fish.audio",
    "packages": [
      {
        "registry": "pypi",
        "name": "fish-audio-sdk"
      },
      {
        "registry": "npm",
        "name": "fish-audio"
      }
    ],
    "auth": "mixed",
    "authNotes": "`Authorization: Bearer` API key created in the web app after a browser signup with email verification. A key takes a name and an optional expiry. The `model` request header selects the model. The hosted MCP server at `https://api.fish.audio/mcp` signs in by OAuth and is bound to one team (https://docs.fish.audio/developer-guide/getting-started/api-key, https://docs.fish.audio/overview/mcp).",
    "pricing": "usage",
    "pricingNotes": "$15 per million UTF-8 bytes of input text on `s2.1-pro`, `s2-pro` and `s1`, prepaid with no subscription or monthly minimum. `s2.1-pro-free` costs $0 under fair-use limits, and the changelog says it is free through 30 November 2026. An agent can start on the free model once a person has signed up. Whether a card is needed is not stated. Concurrency rises with total prepaid amount. MCP usage draws on web app plan credits, not API credits (https://docs.fish.audio/developer-guide/models-pricing/pricing-and-rate-limits).",
    "priceSummary": "Pay per use",
    "where": "hosted",
    "x402": {
      "level": "no",
      "evidence": "No x402, MPP or L402 in the developer docs, the OpenAPI file or the pricing page (checked 2026-10-09).",
      "endpoints": []
    },
    "toolCount": null,
    "popularity": {
      "githubStars": null,
      "npmWeekly": 5213,
      "pypiWeekly": 34220,
      "asOf": "2026-10-09"
    },
    "docsUrl": "https://docs.fish.audio/features/text-to-speech",
    "llmsTxt": "https://docs.fish.audio/llms.txt",
    "openapi": "https://docs.fish.audio/api-reference/openapi.json",
    "capabilities": [
      "speech.tts",
      "speech.streaming",
      "speech.voices",
      "speech.languages",
      "voice.clone"
    ],
    "tags": [
      "hosted",
      "usage-priced",
      "prepaid",
      "free-tier",
      "closed-source",
      "python",
      "typescript",
      "openapi",
      "llms-txt",
      "mcp",
      "streaming",
      "status-page",
      "open-weights"
    ],
    "lastRelease": "2026-09-23",
    "graded": true,
    "anchor": {
      "graded": true,
      "score": 60.7,
      "grade": "C",
      "agentReady": false,
      "rank": 453,
      "ranked": true,
      "rankOf": 842,
      "categoryRank": 8,
      "methodology": "0.4",
      "run": "2026-10-01",
      "scores": {
        "ergonomics": 67,
        "maintenance": 69,
        "payments": 30,
        "reliability": 75,
        "schema": 84,
        "security": 35,
        "transparency": 60
      },
      "pending": [
        "performance",
        "tasks"
      ],
      "breakdown": [
        {
          "key": "reliability",
          "name": "Reliability",
          "weight": 16,
          "effectiveWeight": 20,
          "score": 75,
          "points": 15,
          "reason": "Hosted reading. Better Stack status page at status.fish.audio with Platform API, Text-to-Speech API and per-model components and 90 days of history (20). The Text-to-Speech API component shows downtime on 11 days in the last 90, the longest 58 minutes on 6 August and 40 minutes on 5 October 2026. Those follow the `s2.1-pro-free` component. Paid `s2.1-pro` shows 11 minutes on 15 July, and Platform API shows 2 hours 4 minutes on 12 July. One written incident, the APAC data centre failover on 10 August. No TTS outage reached an hour (18 of 30). Concurrency limits published as 5, 15 and 50 by prepaid amount (15). The docs say the native API returns 429 without `Retry-After` and tell callers to retry 429 and 5xx with exponential backoff. The compatibility endpoints send `Retry-After`. No idempotency key on TTS (12 of 15). The docs mention TTFA and DPA guarantees for `s2.1-pro` but no SLA document or figure was found (0). `s2.1-pro` is generally available, `drama-3-preview` is a preview (10)."
        },
        {
          "key": "performance",
          "name": "Performance",
          "weight": 10,
          "effectiveWeight": 0,
          "pending": true,
          "points": 0,
          "reason": "Pending. Latency is measured per call by our probes, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until the first probe window closes."
        },
        {
          "key": "schema",
          "name": "Schema \u0026 documentation",
          "weight": 13,
          "effectiveWeight": 16.25,
          "score": 84,
          "points": 13.65,
          "reason": "OpenAPI 3.1 file at docs.fish.audio/api-reference/openapi.json, and an AsyncAPI schema rendered on the WebSocket page. The standalone AsyncAPI link in llms.txt returned 404 (25). llms.txt, llms-full.txt, Markdown pages and two agent skills under `/.well-known/agent-skills/` (10). The guide says when to use `convert`, `stream` and the WebSocket, which model to pick and what each `latency` mode trades (16 of 20). Enums for `format`, bitrates, `latency` and the `model` header, ranges on `temperature`, `top_p` and `chunk_length`, one required field. `features` is a free list of strings and the `speed` range is in prose only (12 of 15). Examples in curl, Python and JavaScript and an errors page with a status table. The OpenAPI file lists only 401, 402 and 503 for `/v1/tts`, and the guide and the reference disagree on the defaults for `latency` and `chunk_length` (10 of 15). `/v1` paths and a dated changelog current to 8 October 2026, with no way to pin API behaviour (11 of 15)."
        },
        {
          "key": "ergonomics",
          "name": "Agent ergonomics",
          "weight": 13,
          "effectiveWeight": 16.25,
          "score": 67,
          "points": 10.89,
          "reason": "API reading. MP3, WAV, PCM or Opus with selectable sample rate and bitrate, chunked HTTP output, an SSE stream with alignment and two WebSocket endpoints (21 of 25). `GET /model` pages the voice library with `page_size`, `page_number`, title, tag, language and `self` filters and three sort orders. No maximum text length per request was found (14 of 20). Errors are JSON with `message` and `status`, a status table and typed SDK exceptions, with no error codes for TTS. An unrecognised `model` header falls back to `s2.1-pro` and an unresolved pronunciation dictionary is dropped, both without an error (11 of 20). Retry guidance for 429 and 5xx. No idempotency key, and the pricing page does not say whether a failed TTS request is billed, though it does for speech-to-text and voice design (9 of 20). Only `text` is required, and there are Python and JavaScript SDKs, though npm 0.1.0 defaults to the deprecated `s1` and Python defaults to `s2-pro` (12 of 15)."
        },
        {
          "key": "security",
          "name": "Security \u0026 auth",
          "weight": 14,
          "effectiveWeight": 17.5,
          "score": 35,
          "points": 6.13,
          "reason": "Model reading of the checklist, with training and retention in place of the least-privilege and injection lines, as for the other TTS listings. Named, revocable API keys with optional expiry. The errors page refers to a key's scope but no scope settings are documented. The MCP server uses OAuth bound to one team. No short-lived token for browser TTS was found (20 of 30). The Terms of Use let Usage Data and Content train models with no opt-out found. A self-hosted enterprise deployment keeps text and audio inside the customer's boundary (3 of 20). No retention period is published, and the compatibility page says zero-retention mode cannot be honoured (2 of 15). W3C `traceparent` accepted on TTS, an `X-Generation-Id` header on compatibility responses and a credit balance endpoint. No per-call log documented (8 of 15). security.txt returned 404, the contributing page asks for security reports by email without giving an address, and no SOC 2, ISO 27001 or bug bounty was found in the pages read. The enterprise and trust pages on fish.audio were not read (2 of 20)."
        },
        {
          "key": "payments",
          "name": "Payments \u0026 pricing",
          "weight": 10,
          "effectiveWeight": 12.5,
          "score": 30,
          "points": 3.75,
          "reason": "No x402, MPP or L402 (0). $15 per million UTF-8 bytes published without a login (20). `s2.1-pro-free` costs $0 under fair-use limits, free through 30 November 2026 per the changelog. Whether a card or a prepaid balance is needed is not stated (10 of 20). Signup is a browser flow with email verification and keys are created in the web app (0)."
        },
        {
          "key": "tasks",
          "name": "Task success",
          "weight": 10,
          "effectiveWeight": 0,
          "pending": true,
          "points": 0,
          "reason": "Pending. Task success needs the category task suites run through each tool, which haven't run yet, so this run doesn't score it. Its weight is shared across the assessed categories until then. A data provider's data-quality score is published on its listing now and becomes half of this category when it's scored."
        },
        {
          "key": "maintenance",
          "name": "Maintenance \u0026 community",
          "weight": 7,
          "effectiveWeight": 8.75,
          "score": 69,
          "points": 6.04,
          "reason": "Read as a model. The changelog's newest entries are the S1 retirement notice of 8 October 2026 and `drama-3-preview` on 23 September 2026 (30). Three dated entries in the last 90 days, 18 September, 23 September and 8 October (20). Public changelog, Discord and a support address. We did not test how fast they answer (8 of 15). Official Python and JavaScript SDKs, last published on 10 March 2026. The Python fix for `s2.1` model names was merged on 31 July and is not in a tagged release, and npm 0.1.0 defaults to `s1` (7 of 15). The Python repository has CI across Python versions and Dependabot. Releases are 213 days old (4 of 10)."
        },
        {
          "key": "transparency",
          "name": "Transparency \u0026 trust",
          "weight": 7,
          "effectiveWeight": 8.75,
          "score": 60,
          "points": 5.25,
          "note": "editorial 44, provenance 75",
          "reason": "Closed API with public terms, SDKs under Apache-2.0 and MIT, and S2-Pro weights published under Fish Audio's own research licence, which is not OSI-approved (20 of 30). Terms dated 18 August 2024 and a privacy policy dated 28 August 2024. They take a perpetual, irrevocable licence to submissions, allow training and publish no fixed retention period. The docs refer to DPA guarantees on `s2.1-pro`, and no DPA text was found (5 of 30). A deprecations page with dates, and S1's retirement announced 84 days ahead with a migration guide (16 of 20). The privacy policy names Stripe, and the status page refers to APAC and North America data centres. No sub-processor list found (3 of 20)."
        }
      ],
      "assessment": {
        "date": "2026-10-09",
        "basis": "public evidence",
        "confidence": "medium",
        "notes": {
          "ergonomics": "API reading. MP3, WAV, PCM or Opus with selectable sample rate and bitrate, chunked HTTP output, an SSE stream with alignment and two WebSocket endpoints (21 of 25). `GET /model` pages the voice library with `page_size`, `page_number`, title, tag, language and `self` filters and three sort orders. No maximum text length per request was found (14 of 20). Errors are JSON with `message` and `status`, a status table and typed SDK exceptions, with no error codes for TTS. An unrecognised `model` header falls back to `s2.1-pro` and an unresolved pronunciation dictionary is dropped, both without an error (11 of 20). Retry guidance for 429 and 5xx. No idempotency key, and the pricing page does not say whether a failed TTS request is billed, though it does for speech-to-text and voice design (9 of 20). Only `text` is required, and there are Python and JavaScript SDKs, though npm 0.1.0 defaults to the deprecated `s1` and Python defaults to `s2-pro` (12 of 15).",
          "maintenance": "Read as a model. The changelog's newest entries are the S1 retirement notice of 8 October 2026 and `drama-3-preview` on 23 September 2026 (30). Three dated entries in the last 90 days, 18 September, 23 September and 8 October (20). Public changelog, Discord and a support address. We did not test how fast they answer (8 of 15). Official Python and JavaScript SDKs, last published on 10 March 2026. The Python fix for `s2.1` model names was merged on 31 July and is not in a tagged release, and npm 0.1.0 defaults to `s1` (7 of 15). The Python repository has CI across Python versions and Dependabot. Releases are 213 days old (4 of 10).",
          "payments": "No x402, MPP or L402 (0). $15 per million UTF-8 bytes published without a login (20). `s2.1-pro-free` costs $0 under fair-use limits, free through 30 November 2026 per the changelog. Whether a card or a prepaid balance is needed is not stated (10 of 20). Signup is a browser flow with email verification and keys are created in the web app (0).",
          "reliability": "Hosted reading. Better Stack status page at status.fish.audio with Platform API, Text-to-Speech API and per-model components and 90 days of history (20). The Text-to-Speech API component shows downtime on 11 days in the last 90, the longest 58 minutes on 6 August and 40 minutes on 5 October 2026. Those follow the `s2.1-pro-free` component. Paid `s2.1-pro` shows 11 minutes on 15 July, and Platform API shows 2 hours 4 minutes on 12 July. One written incident, the APAC data centre failover on 10 August. No TTS outage reached an hour (18 of 30). Concurrency limits published as 5, 15 and 50 by prepaid amount (15). The docs say the native API returns 429 without `Retry-After` and tell callers to retry 429 and 5xx with exponential backoff. The compatibility endpoints send `Retry-After`. No idempotency key on TTS (12 of 15). The docs mention TTFA and DPA guarantees for `s2.1-pro` but no SLA document or figure was found (0). `s2.1-pro` is generally available, `drama-3-preview` is a preview (10).",
          "schema": "OpenAPI 3.1 file at docs.fish.audio/api-reference/openapi.json, and an AsyncAPI schema rendered on the WebSocket page. The standalone AsyncAPI link in llms.txt returned 404 (25). llms.txt, llms-full.txt, Markdown pages and two agent skills under `/.well-known/agent-skills/` (10). The guide says when to use `convert`, `stream` and the WebSocket, which model to pick and what each `latency` mode trades (16 of 20). Enums for `format`, bitrates, `latency` and the `model` header, ranges on `temperature`, `top_p` and `chunk_length`, one required field. `features` is a free list of strings and the `speed` range is in prose only (12 of 15). Examples in curl, Python and JavaScript and an errors page with a status table. The OpenAPI file lists only 401, 402 and 503 for `/v1/tts`, and the guide and the reference disagree on the defaults for `latency` and `chunk_length` (10 of 15). `/v1` paths and a dated changelog current to 8 October 2026, with no way to pin API behaviour (11 of 15).",
          "security": "Model reading of the checklist, with training and retention in place of the least-privilege and injection lines, as for the other TTS listings. Named, revocable API keys with optional expiry. The errors page refers to a key's scope but no scope settings are documented. The MCP server uses OAuth bound to one team. No short-lived token for browser TTS was found (20 of 30). The Terms of Use let Usage Data and Content train models with no opt-out found. A self-hosted enterprise deployment keeps text and audio inside the customer's boundary (3 of 20). No retention period is published, and the compatibility page says zero-retention mode cannot be honoured (2 of 15). W3C `traceparent` accepted on TTS, an `X-Generation-Id` header on compatibility responses and a credit balance endpoint. No per-call log documented (8 of 15). security.txt returned 404, the contributing page asks for security reports by email without giving an address, and no SOC 2, ISO 27001 or bug bounty was found in the pages read. The enterprise and trust pages on fish.audio were not read (2 of 20).",
          "transparency": "Closed API with public terms, SDKs under Apache-2.0 and MIT, and S2-Pro weights published under Fish Audio's own research licence, which is not OSI-approved (20 of 30). Terms dated 18 August 2024 and a privacy policy dated 28 August 2024. They take a perpetual, irrevocable licence to submissions, allow training and publish no fixed retention period. The docs refer to DPA guarantees on `s2.1-pro`, and no DPA text was found (5 of 30). A deprecations page with dates, and S1's retirement announced 84 days ahead with a migration guide (16 of 20). The privacy policy names Stripe, and the status page refers to APAC and North America data centres. No sub-processor list found (3 of 20)."
        },
        "sources": [
          {
            "what": "docs index for agents",
            "url": "https://docs.fish.audio/llms.txt",
            "seen": "2026-10-09"
          },
          {
            "what": "text to speech endpoint reference",
            "url": "https://docs.fish.audio/api-reference/endpoint/openapi-v1/text-to-speech",
            "seen": "2026-10-09"
          },
          {
            "what": "WebSocket TTS reference",
            "url": "https://docs.fish.audio/api-reference/endpoint/websocket/tts-live",
            "seen": "2026-10-09"
          },
          {
            "what": "OpenAPI file",
            "url": "https://docs.fish.audio/api-reference/openapi.json",
            "seen": "2026-10-09"
          },
          {
            "what": "text to speech guide",
            "url": "https://docs.fish.audio/features/text-to-speech",
            "seen": "2026-10-09"
          },
          {
            "what": "pricing and rate limits",
            "url": "https://docs.fish.audio/developer-guide/models-pricing/pricing-and-rate-limits",
            "seen": "2026-10-09"
          },
          {
            "what": "models overview",
            "url": "https://docs.fish.audio/developer-guide/models-pricing/models-overview",
            "seen": "2026-10-09"
          },
          {
            "what": "model deprecations",
            "url": "https://docs.fish.audio/developer-guide/models-pricing/deprecations",
            "seen": "2026-10-09"
          },
          {
            "what": "S1 migration guide",
            "url": "https://docs.fish.audio/developer-guide/models-pricing/migrate-from-s1",
            "seen": "2026-10-09"
          },
          {
            "what": "changelog",
            "url": "https://docs.fish.audio/developer-guide/getting-started/changelog",
            "seen": "2026-10-09"
          },
          {
            "what": "errors and retries",
            "url": "https://docs.fish.audio/api-reference/errors",
            "seen": "2026-10-09"
          },
          {
            "what": "tracing",
            "url": "https://docs.fish.audio/api-reference/observability",
            "seen": "2026-10-09"
          },
          {
            "what": "compatibility contract",
            "url": "https://docs.fish.audio/developer-guide/compat/capabilities",
            "seen": "2026-10-09"
          },
          {
            "what": "MCP server",
            "url": "https://docs.fish.audio/overview/mcp",
            "seen": "2026-10-09"
          },
          {
            "what": "API key setup",
            "url": "https://docs.fish.audio/developer-guide/getting-started/api-key",
            "seen": "2026-10-09"
          },
          {
            "what": "agent skills and coding assistants",
            "url": "https://docs.fish.audio/developer-guide/resources/coding-agents",
            "seen": "2026-10-09"
          },
          {
            "what": "full docs text, searched for security and data terms",
            "url": "https://docs.fish.audio/llms-full.txt",
            "seen": "2026-10-09"
          },
          {
            "what": "status page, 90 day component history",
            "url": "https://status.fish.audio",
            "seen": "2026-10-09"
          },
          {
            "what": "APAC data centre incident, 10 August 2026",
            "url": "https://status.fish.audio/incident/1007422",
            "seen": "2026-10-09"
          },
          {
            "what": "Terms of Use",
            "url": "https://fish.audio/terms/",
            "seen": "2026-10-09"
          },
          {
            "what": "Privacy Policy",
            "url": "https://fish.audio/privacy/",
            "seen": "2026-10-09"
          },
          {
            "what": "robots.txt",
            "url": "https://fish.audio/robots.txt",
            "seen": "2026-10-09"
          },
          {
            "what": "security.txt, 404",
            "url": "https://fish.audio/.well-known/security.txt",
            "seen": "2026-10-09"
          },
          {
            "what": "Python SDK repository, tags and changelog",
            "url": "https://github.com/fishaudio/fish-audio-python",
            "seen": "2026-10-09"
          },
          {
            "what": "JavaScript SDK repository",
            "url": "https://github.com/fishaudio/fish-audio-typescript",
            "seen": "2026-10-09"
          },
          {
            "what": "npm package metadata",
            "url": "https://registry.npmjs.org/fish-audio/latest",
            "seen": "2026-10-09"
          },
          {
            "what": "npm weekly downloads",
            "url": "https://api.npmjs.org/downloads/point/last-week/fish-audio",
            "seen": "2026-10-09"
          },
          {
            "what": "PyPI weekly downloads",
            "url": "https://pypistats.org/api/packages/fish-audio-sdk/recent",
            "seen": "2026-10-09"
          },
          {
            "what": "domain registration",
            "url": "https://rdap.org/domain/fish.audio",
            "seen": "2026-10-09"
          }
        ],
        "openQuestions": [
          "unchecked: the fish.audio pricing, enterprise and any trust or security pages. The Terms of Use forbid crawling or scraping the Services, so we read only the terms, the privacy policy and the docs host. A certification or DPA published there would raise the security and transparency scores.",
          "unchecked: GitHub star counts. The GitHub API refused our request for its rate limit, so `githubStars` is empty.",
          "unchecked: the PyPI project page, which answered with a short challenge page. The Python release date comes from the repository's tag and changelog.",
          "unchecked: `https://api.fish.audio/openapi.json`, which the docs call the canonical schema. We read the copy on the docs host and sent no request to the API host.",
          "Whether a failed or interrupted `/v1/tts` request is billed. The pricing page states the rule for speech-to-text and voice design only.",
          "Whether the free model needs a card or a prepaid balance, and what the fair-use limits are.",
          "What the TTFA and DPA guarantees on `s2.1-pro` consist of. No figure or document was found.",
          "The tool list of the MCP server. The MCP page points to one and shows none, so `toolCount` is empty.",
          "Whether a maximum text length applies to one `/v1/tts` request."
        ]
      },
      "negative": 0,
      "verdict": "The API accepts streamed text over a WebSocket, returns word timestamps, and prices speech at $15 per million UTF-8 bytes with a $0 model for development. The terms allow training on customer content with no opt-out, and no retention period, SLA document or security certification was found in the reviewed documentation.",
      "bestFor": "Voice agents that stream LLM text into speech at a low per-byte price, multilingual output from one model, and teams moving from OpenAI or ElevenLabs request shapes.",
      "strengths": [
        "Public OpenAPI 3.1 file, llms.txt, Markdown pages and two installable agent skills for the SDKs and the raw API",
        "WebSocket input takes text as it is produced, with `flush` and `stop` events and a variant that returns word timestamps",
        "`s2.1-pro-free` runs the production model at $0 under fair-use limits, through 30 November 2026",
        "OpenAI-compatible and ElevenLabs-compatible endpoints refuse unsupported options with a 4xx and send `Retry-After` on a 429",
        "S1 retirement was announced on 8 October 2026 for 31 December 2026, with a migration guide"
      ],
      "weaknesses": [
        "The terms allow Usage Data and Content to train models, with no opt-out found",
        "An unrecognised `model` header falls back to paid `s2.1-pro` without an error",
        "The Text-to-Speech API status component shows downtime on 11 days in 90, the longest 58 minutes on 6 August 2026, mostly on the free model",
        "The published SDKs date from March 2026. `fish-audio` 0.1.0 on npm defaults to the deprecated `s1`",
        "No security.txt, certification, DPA text or sub-processor list found in the pages read"
      ],
      "agentNotes": [
        "Send the `model` header on every request and check its spelling. A missing or unknown value is served and billed as `s2.1-pro`.",
        "Budget by UTF-8 bytes, not characters. Chinese, Japanese and Korean text costs about three bytes a character.",
        "Retry 429 and 5xx with exponential backoff. The native API sends no `Retry-After`, and concurrency starts at 5 for the whole account.",
        "Use `[bracket]` cues on the S2 family. `(parenthesis)` tags from `s1` are read aloud as text.",
        "Pass the model explicitly in the JavaScript SDK, because npm release 0.1.0 defaults to `s1`."
      ],
      "metrics": {
        "kind": "remote",
        "measured": false
      },
      "reviewCount": 0,
      "avgRating": 0,
      "history": [
        {
          "basis": "public evidence",
          "confidence": "medium",
          "grade": "C",
          "methodology": "0.4",
          "pending": [
            "performance",
            "tasks"
          ],
          "run": "2026-10-01",
          "runLabel": "October 2026 research run",
          "score": 60.7
        }
      ],
      "editorialScores": {
        "ergonomics": 67,
        "maintenance": 69,
        "payments": 30,
        "reliability": 75,
        "schema": 84,
        "security": 35,
        "transparency": 44
      },
      "provenanceScore": 75
    },
    "connect": {
      "install": "pip install fish-audio-sdk",
      "http": "curl --request POST https://api.fish.audio/v1/tts \\\n  --header \"Authorization: Bearer $FISH_API_KEY\" \\\n  --header \"Content-Type: application/json\" \\\n  --header \"model: s2.1-pro-free\" \\\n  --data '{ \"text\": \"Hello from Fish Audio!\", \"format\": \"mp3\" }' \\\n  --output hello.mp3",
      "claudeCode": "claude mcp add --transport http fish-audio https://api.fish.audio/mcp",
      "config": {
        "mcpServers": {
          "fish-audio": {
            "url": "https://api.fish.audio/mcp"
          }
        }
      }
    },
    "letme": {
      "capability": "https://letme.dev/speech.tts",
      "tool": "https://letme.dev/fish-audio-tts"
    },
    "sameCompany": [
      "fish-audio-voice-cloning"
    ],
    "notable": [
      "The `model` header defaults to `s2.1-pro`, and a missing or unrecognised value falls back to it without an error, so a misspelt `s2.1-pro-free` is billed at $15 per million bytes (https://docs.fish.audio/api-reference/endpoint/openapi-v1/text-to-speech)",
      "S1 was deprecated on 8 October 2026 and retires on 31 December 2026. After that, `s1` requests are served and billed as `s2.1-pro` (https://docs.fish.audio/developer-guide/models-pricing/migrate-from-s1)",
      "OpenAI-compatible and ElevenLabs-compatible endpoints sit under `https://api.fish.audio/compat`, with unsupported options refused by a 4xx and a `Retry-After` header on every 429 (https://docs.fish.audio/developer-guide/compat/capabilities)",
      "The terms allow Usage Data and Content to be used to train models, grant a perpetual, irrevocable licence to User Submissions, and forbid crawling or scraping the Services (https://fish.audio/terms/)",
      "llms.txt lists an AsyncAPI file at `/api-reference/asyncapi.yml` that returned 404 on 2026-10-09. The same schema is rendered on the WebSocket reference page (https://docs.fish.audio/api-reference/endpoint/websocket/tts-live)",
      "Sibling listing `fish-audio-voice-cloning` covers voice model creation and voice design on the same API key, terms and status page"
    ],
    "area": "voice",
    "details": [
      {
        "label": "Models",
        "value": "`s2.1-pro` (default), `s2.1-pro-free`, `s2-pro`, `drama-3-preview` (preview since 23 September 2026), `s1` (deprecated, retires 31 December 2026)"
      },
      {
        "label": "Languages",
        "value": "83 on `s2.1-pro`, detected automatically from the text. 13 on `s1`"
      },
      {
        "label": "Time to first audio",
        "value": "Vendor docs give about 300 ms with `latency` set to `balanced` and 100 ms for `s2-pro`. Not measured by us"
      },
      {
        "label": "Endpoints",
        "value": "`POST /v1/tts`, `POST /v1/tts/stream/with-timestamp` (SSE), WebSocket `/v1/tts/live` and `/v1/tts/live/with-timestamp`, `GET /model` for the voice library, plus `/compat/v1/audio/speech` and `/compat/elevenlabs`"
      },
      {
        "label": "Streaming input",
        "value": "The WebSocket takes MessagePack `start`, `text`, `flush` and `stop` events, so LLM tokens can be sent as they arrive"
      },
      {
        "label": "Speech control",
        "value": "No SSML. Free-form `[bracket]` cues on the S2 family, `prosody.speed` from 0.5 to 2.0, volume in dB, phoneme markup for English, Chinese and Japanese, and up to 3 pronunciation dictionaries a request"
      },
      {
        "label": "Voices",
        "value": "A `reference_id` from the public Voice Library or your own models, inline reference audio over MessagePack, and several speakers in one request with `\u003c|speaker:N|\u003e` tags"
      },
      {
        "label": "Output",
        "value": "MP3 at 64, 128 or 192 kbps, WAV or PCM at 8 to 44.1 kHz, Opus at 48 kHz, all mono"
      },
      {
        "label": "Free tier",
        "value": "`s2.1-pro-free` at $0 under fair-use limits, with no latency or DPA guarantees, free through 30 November 2026 per the changelog"
      },
      {
        "label": "Rate limits",
        "value": "5 concurrent requests under $100 prepaid, 15 from $100, 50 from $1,000, shared by all keys on the account. A 429 on the native API has no `Retry-After` header"
      },
      {
        "label": "Data retention",
        "value": "No fixed period published. The privacy policy keeps Content as long as needed to run the systems, and the compatibility page says zero-retention mode cannot be honoured"
      }
    ],
    "unitPrices": [
      {
        "item": "Text to speech, s2.1-pro",
        "unit": "1m-chars",
        "usd": 15,
        "note": "per million UTF-8 bytes of input text, not characters"
      },
      {
        "item": "Text to speech, s2.1-pro-free",
        "unit": "1m-chars",
        "usd": 0,
        "note": "fair-use limits, free through 30 November 2026 per the changelog"
      }
    ],
    "provenance": {
      "legalEntity": "Hanabi AI Inc.",
      "domain": "fish.audio",
      "domainRegistered": "2023-12-11",
      "endpointOnVendorDomain": true,
      "terms": "https://fish.audio/terms/",
      "privacy": "https://fish.audio/privacy/",
      "statusPage": "https://status.fish.audio",
      "changelog": "https://docs.fish.audio/developer-guide/getting-started/changelog",
      "securityTxt": "none",
      "checked": "2026-10-09",
      "notes": [
        "The Terms of Use (effective 18 August 2024) name Hanabi AI Inc., a Delaware corporation at 1111B S Governors Ave STE 48109, Dover, DE 19904, as the provider of the Services, and cover API keys.",
        "The Privacy Policy is dated 28 August 2024.",
        "https://fish.audio/.well-known/security.txt returned 404 on 2026-10-09.",
        "RDAP for fish.audio gives a registration date of 2023-12-11.",
        "The terms forbid crawling or scraping any page of the Services by manual or automated means. robots.txt on fish.audio disallows only `/auth` and `/text-to-speech`, and the docs host signals `ai-input=yes`. We read the terms, the privacy policy and the docs host, and no other fish.audio page."
      ],
      "score": 75,
      "checks": [
        {
          "check": "Legal entity named",
          "value": "Hanabi AI Inc.",
          "points": 20,
          "max": 20,
          "state": "ok"
        },
        {
          "check": "Domain age",
          "value": "fish.audio, registered 2023-12-11 (2 years)",
          "points": 7,
          "max": 15,
          "state": "part"
        },
        {
          "check": "Endpoint on the vendor's domain",
          "value": "api.fish.audio",
          "points": 15,
          "max": 15,
          "state": "ok"
        },
        {
          "check": "Terms of service",
          "value": "read, states 6 of the 7 things a reader expects, and has 3 clauses that cost points",
          "points": 3.1,
          "max": 10,
          "state": "part"
        },
        {
          "check": "Privacy policy",
          "value": "read, states 8 of the 8 things a reader expects",
          "points": 10,
          "max": 10,
          "state": "ok"
        },
        {
          "check": "Status page",
          "value": "status.fish.audio",
          "points": 10,
          "max": 10,
          "state": "ok"
        },
        {
          "check": "Changelog",
          "value": "published",
          "points": 10,
          "max": 10,
          "state": "ok"
        },
        {
          "check": "security.txt",
          "value": "not found",
          "points": 0,
          "max": 10,
          "state": "no"
        }
      ],
      "policies": [
        {
          "kind": "terms",
          "url": "https://fish.audio/terms/",
          "state": "read",
          "readAt": "2026-10-08",
          "statedDate": "2024-08-18",
          "words": 9324,
          "points": 3.1,
          "max": 10,
          "expected": [
            {
              "key": "terms.date",
              "label": "Gives the date it was last updated",
              "found": true,
              "quote": "Effective date: August 18, 2024",
              "says": "Last updated 2024-08-18"
            },
            {
              "key": "terms.law",
              "label": "Names the governing law or courts",
              "found": true,
              "quote": "This Agreement is governed by and will be construed under the Federal Arbitration Act, applicable federal law, and the laws of the State of California, without regard to the conflicts of laws provisions thereof.",
              "says": "The law of the State of California"
            },
            {
              "key": "terms.liability",
              "label": "States a limit on its liability",
              "found": true,
              "quote": "…(B) ANY SUBSTITUTE GOODS, SERVICES OR TECHNOLOGY, (C) ANY AMOUNT, IN THE AGGREGATE, IN EXCESS OF THE GREATER OF (I) ONE-HUNDRED ($100) DOLLARS OR (II) THE AMOUNTS PAID AND/OR PAYABLE BY YOU TO Fish.Audio IN CONNECTION WITH THE SERVICES IN THE TWELVE (12) MONTH PERIOD PRECEDING THIS APPLICABLE CLAIM OR (D) ANY MATTER B…",
              "says": "Capped at $100"
            },
            {
              "key": "terms.termination",
              "label": "Says how the agreement or account can be ended",
              "found": true,
              "quote": "A violation of any of the foregoing is grounds for termination of your right to use or access the Services."
            },
            {
              "key": "terms.changes",
              "label": "Says how changes to the terms are announced",
              "found": true,
              "quote": "We reserve the right to change this Agreement at any time, but if we do, we will place a notice on our site located at https://fish.audio/terms/, send you an email, and/or notify you by some other means.",
              "says": "Says it gives notice of a change"
            },
            {
              "key": "terms.use",
              "label": "Lists what users may not do",
              "found": true,
              "quote": "If you do not understand the Agreement, or do not accept any part of it, then you may not use the Services.If you have any questions, comments, or concerns regarding these terms or the Services, please contact us at:"
            },
            {
              "key": "terms.sla",
              "label": "Refers to a service level or uptime commitment",
              "found": false
            }
          ],
          "toKnow": [
            {
              "key": "training",
              "label": "Says it may use customer content to train or improve models, and no opt-out was found",
              "found": true,
              "quote": "Usage Data and Content may be used to develop, train, or enhance artificial intelligence or machine learning models that are part of Fish.Audio’s products and services, including third-party components of the Services",
              "costsPoints": true
            },
            {
              "key": "terms.automated",
              "label": "Restricts automated access",
              "found": true,
              "quote": "(h) “crawls,” “scrapes,” or “spiders” any page, data, or portion of or relating to the Services or Content (through use of manual or automated means);",
              "costsPoints": true
            },
            {
              "key": "terms.benchmark",
              "label": "Restricts benchmarking or competitive use",
              "found": true,
              "quote": "(j) use output from the Services to develop models that compete with Fish.Audio;",
              "costsPoints": true
            },
            {
              "key": "terms.cutoff",
              "label": "Says access can be ended without notice or for any reason",
              "found": true,
              "quote": "We reserve the right to terminate your right to use or access the Services at any time, for any reason, in our sole discretion, and without notice."
            },
            {
              "key": "terms.arbitration",
              "label": "Requires arbitration or waives class actions",
              "found": true,
              "quote": "Please read the following ARBITRATION AGREEMENT carefully because it requires you to arbitrate certain disputes and claims with Fish.Audio and limits the manner in which you can seek relief from Fish.Audio."
            }
          ],
          "notes": [
            {
              "date": "2026-10-08",
              "text": "The terms limit use to internal, personal, non-commercial purposes and not on behalf of a third party, and the following sentence grants a licence for commercial use for users of Paid Services.",
              "quote": "You will only use the Services for your own internal, personal, non-commercial use, and not on behalf of or for the benefit of any third party, and only in a manner that complies with all laws that apply to you."
            },
            {
              "date": "2026-10-08",
              "text": "The licences the user grants over User Submissions are royalty-free, perpetual, sublicensable, irrevocable and worldwide.",
              "quote": "You agree that the licenses you grant are royalty-free, perpetual, sublicensable, irrevocable, and worldwide"
            },
            {
              "date": "2026-10-08",
              "text": "Any cause of action arising out of or related to the services must commence within one year after it accrues.",
              "quote": "YOU AND Fish.Audio AGREE THAT ANY CAUSE OF ACTION ARISING OUT OF OR RELATED TO THE SERVICES MUST COMMENCE WITHIN ONE (1) YEAR AFTER THE CAUSE OF ACTION ACCRUES."
            }
          ]
        },
        {
          "kind": "privacy",
          "url": "https://fish.audio/privacy/",
          "state": "read",
          "readAt": "2026-10-08",
          "statedDate": "2024-08-28",
          "words": 7630,
          "points": 10,
          "max": 10,
          "expected": [
            {
              "key": "privacy.date",
              "label": "Gives the date it was last updated",
              "found": true,
              "quote": "Effective date: August 28, 2024",
              "says": "Last updated 2024-08-28"
            },
            {
              "key": "privacy.collected",
              "label": "Says what personal data is collected",
              "found": true,
              "quote": "This chart details the categories of Personal Data that we collect and have collected over the past 12 months:"
            },
            {
              "key": "privacy.retention",
              "label": "Says how long data is kept",
              "found": true,
              "quote": "We retain Personal Data about you for as long as necessary to provide you with our Services or to perform our business or commercial purposes for collecting your Personal Data.",
              "says": "For as long as needed, with no period named"
            },
            {
              "key": "privacy.processors",
              "label": "Says who else receives the data",
              "found": true,
              "quote": "Categories of Third Parties With Whom We Share this Personal Data:"
            },
            {
              "key": "privacy.sale",
              "label": "Says whether personal data is sold or shared for advertising",
              "found": true,
              "quote": "We will not sell your Personal Data, and have not done so over the last 12 months.",
              "says": "Says it does not sell personal data"
            },
            {
              "key": "privacy.rights",
              "label": "Says what rights people have over their data",
              "found": true,
              "quote": "You have the right to correct inaccuracies in your Personal Data, to the extent such correction is appropriate in consideration of the nature of such data and our purposes of processing your Personal Data."
            },
            {
              "key": "privacy.contact",
              "label": "Gives a privacy contact",
              "found": true,
              "quote": "These transfers are made pursuant to appropriate safeguards, such as standard data protection clauses adopted by the European Commission, If you wish to enquire further about these safeguards, please contact us at support@fish.audio.",
              "says": "support@fish.audio"
            },
            {
              "key": "privacy.transfers",
              "label": "Says where data is transferred or stored",
              "found": true,
              "quote": "If you normally reside in the European Region, the personal data that we collect from you will be further transferred to, and stored at, a destination outside of the European Region (for instance, to our service providers and partners)."
            }
          ],
          "toKnow": [
            {
              "key": "privacy.sells",
              "label": "Says it sells personal data or shares it for advertising",
              "found": true,
              "quote": "Depending on state laws that may be applicable to you, some of these disclosures may constitute a “sale” of your Personal Data."
            }
          ]
        }
      ]
    },
    "pageJsonUrl": "https://www.anchorterminal.com/tools/fish-audio-tts.json",
    "live": {
      "slug": "fish-audio-tts",
      "probe": {
        "target": "https://api.fish.audio",
        "method": "get",
        "lastAt": "2026-10-09T09:26:50.354193451Z",
        "lastOk": true,
        "lastStatus": 404,
        "lastMs": 263,
        "authRequired": false,
        "uptime24h": 100,
        "uptime30d": 100,
        "p50ms24h": 162,
        "p95ms24h": 224,
        "samples24h": 20,
        "samples30d": 20,
        "days": [
          {
            "date": "2026-10-09",
            "probes": 20,
            "ok": 20
          }
        ]
      },
      "vendorStatus": {
        "page": "https://status.fish.audio",
        "indicator": "unknown",
        "summary": "no machine-readable status found",
        "checkedAt": "2026-10-09T07:57:55.361055093Z"
      },
      "updatedAt": "2026-10-09T09:26:50.354193451Z"
    }
  }
}
