{
  "publisher": "SpeechifyAI",
  "provenance": "SpeechifyAI's reading of each provider's own official text-to-speech documentation on 13 Oct 2026, for /blog/tts-api-per-user-rate-limits-safety-identifier. Quotes are verbatim from the page named in the entry's sources. The question for each provider: does its text-to-speech request carry a field naming the customer's own end user, and do its docs give a way to limit or block one end user rather than the whole account.",
  "capturedOn": "2026-10-13",
  "date": "13 Oct 2026",
  "scope": "The text-to-speech endpoints only: REST, streaming and WebSocket where the provider has them. LLM, chat, realtime and agent endpoints are out of scope, except where a note says what they offer.",
  "notes": [
    "SpeechifyAI's own behaviour is not repeated here. It is documented at https://docs.speechify.ai/build/guides/concepts/safety-identifiers.",
    "endUserField is the field on the text-to-speech request that names the customer's end user, or null when the request reference has none.",
    "perEndUserControl is true only when the docs give a way to limit or block one end user on text to speech. No provider here had one.",
    "OpenAI documents safety_identifier, and blocking by it, on the Responses API, Chat Completions and Realtime. Its POST /v1/audio/speech takes no safety_identifier and no user field.",
    "Deepgram's tag on the REST speak request is a free-form usage-report label, which a customer could fill with an end-user id. Its rate limits apply per project, with no per-tag limit, and the speak WebSocket takes no tag. Its tagging guide is titled Tagging STT Requests and does not mention text to speech.",
    "Google Cloud documents a platform-wide system parameter, quotaUser, described as a pseudo user identifier for charging per-user quotas. It is not on the text-to-speech reference, and every text-to-speech quota Google publishes is per project.",
    "Azure: the Speech SDK's synthesis configuration was not read separately. The quotas page says the same per-resource limits cover the SDK and REST."
  ],
  "rows": [
    {
      "provider": "OpenAI",
      "endpoints": [
        "Create speech, POST /v1/audio/speech"
      ],
      "endUserField": null,
      "perEndUserControl": false,
      "limitsApplyPer": "organization and project",
      "quotes": [
        "The `safety_identifier` parameter is available in both the Responses API and Chat Completions API.",
        "In a high confidence policy violation, the associated `safety_identifier` is completely blocked from OpenAI model access.",
        "reduce the chance that one user's misuse disrupts access for your broader organization.",
        "Rate limits are defined at the organization level and at the project level, not user level."
      ],
      "sources": [
        "https://developers.openai.com/api/reference/resources/audio/subresources/speech/methods/create",
        "https://developers.openai.com/api/docs/guides/safety-checks",
        "https://developers.openai.com/api/docs/guides/safety-best-practices",
        "https://developers.openai.com/api/docs/guides/rate-limits"
      ]
    },
    {
      "provider": "ElevenLabs",
      "endpoints": [
        "Text to speech convert",
        "Text to speech stream-input WebSocket"
      ],
      "endUserField": null,
      "perEndUserControl": false,
      "limitsApplyPer": "subscription plan",
      "quotes": [
        "Your subscription plan determines how many requests can be processed simultaneously"
      ],
      "sources": [
        "https://elevenlabs.io/docs/api-reference/text-to-speech/convert",
        "https://elevenlabs.io/docs/api-reference/text-to-speech/v-1-text-to-speech-voice-id-stream-input",
        "https://elevenlabs.io/docs/overview/models"
      ]
    },
    {
      "provider": "Cartesia",
      "endpoints": [
        "TTS bytes",
        "TTS SSE",
        "TTS WebSocket"
      ],
      "endUserField": null,
      "perEndUserControl": false,
      "limitsApplyPer": "plan",
      "quotes": [
        "Your subscription plan determines how many requests can be processed simultaneously."
      ],
      "sources": [
        "https://docs.cartesia.ai/api-reference/tts/bytes",
        "https://docs.cartesia.ai/api-reference/tts/sse",
        "https://docs.cartesia.ai/api-reference/tts/websocket",
        "https://docs.cartesia.ai/use-the-api/concurrency-limits-and-timeouts"
      ]
    },
    {
      "provider": "Deepgram",
      "endpoints": [
        "Speak REST request",
        "Speak streaming WebSocket"
      ],
      "endUserField": "tag, on the REST speak request only: a usage-report label",
      "perEndUserControl": false,
      "limitsApplyPer": "project",
      "quotes": [
        "Label your requests for the purpose of identification during usage reporting",
        "Rate limits apply per project, not per account or API key."
      ],
      "sources": [
        "https://developers.deepgram.com/reference/text-to-speech/speak-request",
        "https://developers.deepgram.com/reference/text-to-speech/speak-streaming",
        "https://developers.deepgram.com/reference/api-rate-limits",
        "https://developers.deepgram.com/docs/tagging"
      ]
    },
    {
      "provider": "Google Cloud",
      "endpoints": [
        "text.synthesize"
      ],
      "endUserField": null,
      "perEndUserControl": false,
      "limitsApplyPer": "project",
      "quotes": [
        "RequestsPerMinutePerProject: 1,000",
        "A pseudo user identifier for charging per-user quotas."
      ],
      "sources": [
        "https://docs.cloud.google.com/text-to-speech/docs/reference/rest/v1/text/synthesize",
        "https://docs.cloud.google.com/text-to-speech/quotas",
        "https://docs.cloud.google.com/apis/docs/system-parameters"
      ]
    },
    {
      "provider": "Amazon Polly",
      "endpoints": [
        "SynthesizeSpeech"
      ],
      "endUserField": null,
      "perEndUserControl": false,
      "limitsApplyPer": "account, in each region",
      "quotes": [
        "The request does not use any URI parameters.",
        "The default quota for the `SynthesizeSpeech` request with standard voices is 80 transactions per second (tps), in a single region, for a single AWS account."
      ],
      "sources": [
        "https://docs.aws.amazon.com/polly/latest/dg/API_SynthesizeSpeech.html",
        "https://docs.aws.amazon.com/polly/latest/dg/limits.html"
      ]
    },
    {
      "provider": "Azure",
      "endpoints": [
        "REST text to speech"
      ],
      "endUserField": null,
      "perEndUserControl": false,
      "limitsApplyPer": "Speech resource",
      "quotes": [
        "Text-to-speech quotas and limits per resource",
        "30 transactions per second (TPS) (default value)",
        "You exceeded the quota or rate of requests allowed for your resource."
      ],
      "sources": [
        "https://learn.microsoft.com/en-us/azure/ai-services/speech-service/rest-text-to-speech",
        "https://learn.microsoft.com/en-us/azure/ai-services/speech-service/speech-services-quotas-and-limits"
      ]
    }
  ]
}
