redact-secret · Report
API key (sk_)
sk_ + 48 lowercase hex, with an optional provider-code-evidenced _residency_<region> suffix, sent in the xi-api-key header.
Research record
3 events in the review history: 2 observed, 1 reviewed. Latest: observed on 2026-09-27 by automation, project maintainer. Project-maintained review is not independent validation. The family record at this release.
Format
What it looks like
- Descriptive pattern
^sk_[0-9a-f]{48}$
Parts are shown as recorded. Evidence classes belong to the facts below; no class is assigned to a part.
Format facts
Provider documented ·
provider-source· current · observed 2026-09-26SpeechEngineServer docstring api_key="sk_..." and the _residency_ suffix regex in elevenlabs-python and elevenlabs-js: ElevenLabs' own SDK source shows keys written sk_... and parses a data-residency suffix with _residency_[a-z0-9]+$ (elevenlabs-python speech_engine/resource.py, elevenlabs-js SpeechEngineResource.ts). No documentation page states the prefix, a length or an alphabet. Provider code is not documentation; T1 on it is the maintainer ruling of 2026-09-27 (redact-secret#788, huggingface:api-token precedent), scoped to the sk_ prefix and the _residency_ suffix grammar. The 48-hex body stays T2
- elevenlabs/elevenlabs-python @ main: src/elevenlabs/speech_engine/server.pyprovider-documentation · last read 2026-09-27 · latest outcome read · supports ElevenLabs' own SDK source shows keys written sk_... and parses a data-residency suffix with _residency_[a-z0-9]+$ (elevenlabs-python speech_engine/resource.py, elevenlabs-js SpeechEngineResource.ts). No documentation page states the prefix, a length or an alphabet. Provider code is not documentation; T1 on it is the maintainer ruling of 2026-09-27 (redact-secret#788, huggingface:api-token precedent), scoped to the sk_ prefix and the _residency_ suffix grammar. The 48-hex body stays T2
Tool corroborated ·
tool-corroboration· current · observed 2026-09-26Pinned scanner rules are consistent with the contract grammar (2 artifacts: betterleaks; trufflehog 3.97.4).
- betterleaks/betterleaks @ main: cmd/generate/config/rules/elevenlabs.goscanner-rule-source · last read 2026-09-26 · latest outcome read · supports betterleaks: elevenlabs-api-key: sk_[0-9a-f]{48} beside an elevenlabs keyword (matched case-insensitively)
- trufflesecurity/trufflehog @ v3.97.4: pkg/detectors/elevenlabs/v2/elevenlabs.goscanner-rule-source · last read 2026-09-26 · latest outcome read · supports trufflehog 3.97.4: ElevenLabs v2: \b((?:sk)_[a-f0-9]{48})\b, keyword-gated
Provider documented ·
field-prefix· current · observed 2026-09-26prefix: sk_
- elevenlabs/elevenlabs-python @ main: src/elevenlabs/speech_engine/resource.pyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports prefix: sk_
- elevenlabs/elevenlabs-python @ main: src/elevenlabs/speech_engine/server.pyprovider-documentation · last read 2026-09-27 · latest outcome read · supports docstring api_key="sk_..."
Tool corroborated ·
field-body· current · observed 2026-09-26body: 48 lowercase hexadecimal characters (51 in all) (Two tools (Kingfisher aliases betterleaks) and measured samples; no provider statement. T2 by the 2026-09-27 ruling: positives carry 48 hex, and the length and non-hex twins are recorded as disputed properties, not asserted.)
- betterleaks/betterleaks @ main: cmd/generate/config/rules/elevenlabs.goscanner-rule-source · last read 2026-09-26 · latest outcome read · supports body: 48 lowercase hexadecimal characters (51 in all)
- github.com/redact-secret/redact-secret/issues/788scanner-rule-source · last read 2026-09-26 · latest outcome read · supports measured fragments, all 48 hex
- trufflesecurity/trufflehog @ v3.97.4: pkg/detectors/elevenlabs/v2/elevenlabs.goscanner-rule-source · last read 2026-09-26 · latest outcome read · supports body: 48 lowercase hexadecimal characters (51 in all)
Unresolved ·
field-body-case· current · observed 2026-09-26body-case: uppercase hexadecimal (The tools disagree and no provider source decides it, so no uppercase twin is authored (docs/decisions/2026-09-24-stop-asserting-provider-undecided-format-properties.md).)
- betterleaks/betterleaks @ main: cmd/generate/config/rules/elevenlabs.goscanner-rule-source · last read 2026-09-26 · latest outcome read · supports semi-generic rule, case-insensitive
- trufflesecurity/trufflehog @ v3.97.4: pkg/detectors/elevenlabs/v2/elevenlabs.goscanner-rule-source · last read 2026-09-26 · latest outcome read · supports case-sensitive [a-f0-9]
Provider documented ·
field-residency-suffix· current · observed 2026-09-26residency-suffix: an optional _residency_<[a-z0-9]+> suffix for isolated environments (EU, India, Singapore) (Authored as an envelope beside the secret span; whether the finding includes it is the product's decision. No code-search fragment showed the suffix.)
- elevenlabs.io/docs/overview/administration/data-residencyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports a different API URL with a different API key
- elevenlabs/elevenlabs-js @ main: src/wrapper/speech-engine/SpeechEngineResource.tsprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports residency-suffix: an optional _residency_<[a-z0-9]+> suffix for isolated environments (EU, India, Singapore)
- elevenlabs/elevenlabs-python @ main: src/elevenlabs/speech_engine/resource.pyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports _RESIDENCY_KEY_SUFFIX = re.compile(r"_residency_[a-z0-9]+$")
Unresolved ·
field-legacy-form· current · observed 2026-09-26legacy-form: a bare 32-hex key from before the sk_ prefix (No provider source documents a 32-hex key. Not claimed, never a control.)
- trufflesecurity/trufflehog @ v3.97.4: pkg/detectors/elevenlabs/v1/elevenlabs.goscanner-rule-source · last read 2026-09-26 · latest outcome read · supports v1: keyword-context [a-f0-9]{32}
Provider documented ·
field-header· current · observed 2026-09-26header: sent in the xi-api-key HTTP header
- elevenlabs.io/docs/api-reference/authenticationprovider-documentation · last read 2026-09-27 · latest outcome read · supports header: sent in the xi-api-key HTTP header
Provider documented ·
field-sibling-prefixes· current · observed 2026-09-26sibling-prefixes: sk_live_, sk_test_ and sk_org_ are Stripe key types; Pollinations plans sk_ + 32 characters (The Stripe shape is a scoped prefix twin (co-detected by stripe-token); it is never a benign control.)
- docs.stripe.com/keysprovider-documentation · last read 2026-10-04 · latest outcome read · supports sibling-prefixes: sk_live_, sk_test_ and sk_org_ are Stripe key types; Pollinations plans sk_ + 32 characters
- github.com/pollinations/pollinations/issues/13183provider-documentation · last read 2026-09-26 · latest outcome read · supports community: a plan, not a shipped format
Provider documented ·
field-public-identifiers· current · observed 2026-09-26public-identifiers: key_id, hint and hashed_xi_api_key are non-secret listing fields; single-use tokens are a separate credential (The listing examples are the literal word string, so no shape is claimed for them beyond what the controls construct.)
- elevenlabs.io/docs/api-reference/authenticationprovider-documentation · last read 2026-09-27 · latest outcome read · supports public-identifiers: key_id, hint and hashed_xi_api_key are non-secret listing fields; single-use tokens are a separate credential
- elevenlabs.io/docs/api-reference/service-accounts/api-keys/createprovider-documentation · last read 2026-09-26 · latest outcome read · supports public-identifiers: key_id, hint and hashed_xi_api_key are non-secret listing fields; single-use tokens are a separate credential
Unresolved ·
listed-references· current · observed 2026-09-26The legacy contract lists 10 references without stating which property each supports.
- docs.stripe.com/keysprovider-documentation · last read 2026-10-04 · latest outcome read · supports Listed as a reference by the legacy contract
- elevenlabs.io/docs/api-reference/authenticationprovider-documentation · last read 2026-09-27 · latest outcome read · supports Listed as a reference by the legacy contract
- elevenlabs.io/docs/api-reference/service-accounts/api-keys/createprovider-documentation · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- elevenlabs.io/docs/overview/administration/data-residencyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- elevenlabs.io/docs/overview/administration/workspaces/api-keysprovider-documentation · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- elevenlabs/elevenlabs-js @ main: src/wrapper/speech-engine/SpeechEngineResource.tsprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- elevenlabs/elevenlabs-python @ main: src/elevenlabs/speech_engine/resource.pyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/pollinations/pollinations/issues/13183provider-documentation · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret/issues/865issue-or-discussion · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret/issues/788scanner-rule-source · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
Provider documented ·
dossier-research· current · observed 2026-09-27Legacy dossier research (verdict ready, tier T1) cited 4 sources; the dossier does not attribute sources to individual properties.
- elevenlabs.io/docs/api-reference/authenticationprovider-documentation · last read 2026-09-27 · latest outcome read · supports Cited by the legacy dossier research for this family
- elevenlabs/elevenlabs-js @ a46177b4888e542efa8ae2ae3b6bd68b6a0979f4: src/wrapper/speech-engine/SpeechEngineResource.tsprovider-sdk-source · last read 2026-09-27 · latest outcome read · supports Cited by the legacy dossier research for this family
- elevenlabs/elevenlabs-python @ 1b45413e916fda868341ad48225c4b7211017849: src/elevenlabs/speech_engine/server.pyprovider-sdk-source · last read 2026-09-27 · latest outcome read · supports Cited by the legacy dossier research for this family
- elevenlabs/elevenlabs-python @ fd6d5c29f7d22402420c17b27968f9c861f1b394: src/elevenlabs/speech_engine/resource.pyprovider-sdk-source · last read 2026-09-27 · latest outcome read · supports Cited by the legacy dossier research for this family
Provider documented ·
taxonomy-sources· current · observed 2026-09-27The legacy taxonomy lists 2 sources for this family. The taxonomy records no date; the dossier researchedAt is used as the observed-at date.
- elevenlabs.io/docs/api-reference/authenticationprovider-documentation · last read 2026-09-27 · latest outcome read · supports Listed as a source for this family in the legacy taxonomy
- elevenlabs/elevenlabs-python @ main: src/elevenlabs/speech_engine/server.pyprovider-documentation · last read 2026-09-27 · latest outcome read · supports Listed as a source for this family in the legacy taxonomy
Open questions
No open question is recorded for this revision.
Benchmark dossier notes
- Shape
sk_followed by 48 lowercase hexadecimal characters (51 in all), with an optional_residency_<region>suffix matching_residency_[a-z0-9]+(regions seen:in,eu). The suffix belongs to the key, so a residency key is redacted whole. Body length and alphabet are stated by no provider source.- Basis
- T1 by maintainer ruling of 2026-09-27, on provider SDK code (the
huggingface:api-tokenprecedent): a docstringapi_key="sk_..."inspeech_engine/server.py, and_RESIDENCY_KEY_SUFFIXinresource.pyand the JSSpeechEngineResource.ts. The docs pages state neither prefix nor length. The body is T2: trufflehog v2, betterleaks (Kingfisher aliases it) and about 35 code-search fragments, all 48 lowercase hex where fully formed. - Issuance
- not attempted. The #788 checklist covers user and service-account keys, an isolated-environment key and its suffix, the displayed
hint, and whether an old account still holds a 32-hex key. - Contract in core
- detector-families.md; the spec row records the T1 ruling and the T2 body. #866 covers the single-line SDK-argument form generically.
In this benchmark
- Fixtures
- 38
- Left readable
- 0
- Redacted too much
- 0
- False alarms
- 0
38 fixtures: 13 expect a redaction, 25 must stay quiet. See every row
| Evidence level | Fixtures | Left readable | Too much | False alarms |
|---|---|---|---|---|
| T1Provider-documented | 13 | 0 | 0 | 0 |
| T2Tool-corroborated | 14 | 0 | 0 | 0 |
| T3Project policy | 8 | 0 | 0 | 0 |
| T0Pending review | 3 | 0 | 0 | 0 |
Every scanner on the same fixtures
In run order. Counts are what each scanner recorded on this family's fixtures, whichever rules it has; a scanner with no rule for the family has nothing to report on it.
| Scanner | Fixtures | Left readable | Too much | False alarms |
|---|---|---|---|---|
| flare-redactRuntime library · 1.6.1 · Published npm package · secrets-only (pii, generic_assignment disabled) · JavaScript engineNo rule maps to it | 38 | 13 | 0 | 0 |
| gitleaksRepository scanner · 8.30.1 · Directory scan · default rulesNo rule maps to it | 38 | 5 | 0 | 1 |
| redact-secretProduct measured here · 0.1.0-beta.14 · Published npm package · default detectors1 detector mapped | 38 | 0 | 0 | 0 |
| trufflehogRepository scanner · 3.97.4 · Filesystem scan · verification disabled1 rule targets it | 38 | 5 | 0 | 0 |
Benchmark dossier questions
- Open caveat
- T1 covers the sk_ prefix and _residency_ suffix (SDK code, by ruling); the 48-lowercase-hex body is T2 with no provider statement. The legacy 32-hex form is unresearched; needs issued keys (checklist in #788).
Looks like it, but isn't
- Collisions
sk_is shared with Stripe (sk_live_,sk_test_,sk_org_) and with a planned Pollinationssk_plus 32 characters key, so the prefix alone cannot attribute a key. The response fieldskey_id,hintandhashed_xi_api_keyare non-secret; so are voice ids.
Scanner rules for this family
| Scanner | Rule | What the rule matches |
|---|---|---|
| trufflehog · rules 3.97.4 | elevenlabs/v2 | sk_ + 48 hex |
No rule maps to this family in flare-redact, gitleaks, openredaction.
Fixtures in this family
| Fixture | Kind and evidence | redact-secret |
|---|---|---|
elevenlabs-api-key-curl-xi-api-keyelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-dotenvelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-export-xi-api-keyelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-hashed-key-encoded-valueelevenlabs · benign-encoded-value | Must not flagT2 · Tool-corroborated | Quiet |
elevenlabs-api-key-js-clientelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-key-shape-bareelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-key-shape-quotedelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-key-shape-unicode-crlfelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-pasted-keyelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-python-multi-lineelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-python-single-lineelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-residency-suffixelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-tool-callelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-yaml-configelevenlabs · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
elevenlabs-api-key-stripe-shaped-twincross-provider · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
elevenlabs-api-key-stripe-test-shaped-twincross-provider · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
elevenlabs-api-key-ak-prefix-twinelevenlabs · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
elevenlabs-api-key-docs-ellipsis-placeholderelevenlabs · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
elevenlabs-api-key-embedded-leading-twinelevenlabs · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
elevenlabs-api-key-env-reference-referenceelevenlabs · templated-reference | Must not flagT3 · Project policy | Quiet |
elevenlabs-api-key-hyphen-prefix-twinelevenlabs · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
elevenlabs-api-key-key-hint-public-idelevenlabs · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
elevenlabs-api-key-key-id-public-idelevenlabs · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
elevenlabs-api-key-label-proseelevenlabs · benign-lookalike | Must not flagT3 · Project policy | Quiet |
elevenlabs-api-key-long-body-twinelevenlabs · unsettled-evidence-input | Pending reviewT0 · Pending · twin | Unscored |
elevenlabs-api-key-maskelevenlabs · benign-lookalike | Must not flagT3 · Project policy | Quiet |
elevenlabs-api-key-masked-stars-placeholderelevenlabs · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
elevenlabs-api-key-missing-underscore-twinelevenlabs · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
elevenlabs-api-key-non-hex-body-twinelevenlabs · unsettled-evidence-input | Pending reviewT0 · Pending · twin | Unscored |
elevenlabs-api-key-pk-prefix-twinelevenlabs · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
elevenlabs-api-key-prefix-onlyelevenlabs · benign-lookalike | Must not flagT2 · Tool-corroborated | Quiet |
elevenlabs-api-key-referenceelevenlabs · benign-lookalike | Must not flagT3 · Project policy | Quiet |
elevenlabs-api-key-residency-hosts-proseelevenlabs · prose-mention | Must not flagT3 · Project policy | Quiet |
elevenlabs-api-key-short-bodyelevenlabs · benign-lookalike | Must not flagT2 · Tool-corroborated | Quiet |
elevenlabs-api-key-short-body-twinelevenlabs · unsettled-evidence-input | Pending reviewT0 · Pending · twin | Unscored |
elevenlabs-api-key-unprefixed-hex-near-misselevenlabs · format-near-miss | Must not flagT2 · Tool-corroborated | Quiet |
elevenlabs-api-key-voice-id-public-idelevenlabs · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
elevenlabs-api-key-your-api-key-placeholderelevenlabs · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
Sources
Documentation and code
- github.com/elevenlabs/elevenlabs-python/blob/main/src/elevenlabs/speech_engine/server.py
- elevenlabs.io/docs/api-reference/authentication
- github.com/elevenlabs/elevenlabs-python/blob/1b45413e916fda868341ad48225c4b7211017849/src/elevenlabs/speech_engine/server.py
- github.com/elevenlabs/elevenlabs-python/blob/fd6d5c29f7d22402420c17b27968f9c861f1b394/src/elevenlabs/speech_engine/resource.py
- github.com/elevenlabs/elevenlabs-js/blob/a46177b4888e542efa8ae2ae3b6bd68b6a0979f4/src/wrapper/speech-engine/SpeechEngineResource.ts
Research log
- redact-secret/redact-secret#788Research issue
- redact-secret/redact-secret#774Research issue
- redact-secret/redact-secret#865Research issue
- redact-secret/redact-secret#866Research issue
- redact-secret/redact-secret-benchmarks#384Research issue