redact-secret · Report
API key (unprefixed)
32 alphanumeric characters recognised only beside a same-line AI21 name, host or SDK constructor; the shape rests on one ten-sample maintainer observation.
Research record
3 events in the review history: 2 observed, 1 reviewed. Latest: observed on 2026-09-29 by automation, project maintainer. Project-maintained review is not independent validation. The family record at this release.
Format
What it looks like
- Descriptive pattern
^[A-Za-z0-9]{32}$
Parts are shown as recorded. Evidence classes belong to the facts below; no class is assigned to a part.
Format facts
Tool corroborated ·
tool-corroboration· current · observed 2026-09-26Pinned scanner rules are consistent with the contract grammar (3 artifacts: LLM-Runner-Router (independent implementation); Vulnetix vnx-sec-315; keychecker (independent implementation)).
- cunnymessiah/keychecker @ 122eadc6bdbbeec9f31e94878f98c4692d5b5718: main.pyscanner-rule-source · last read 2026-09-29 · latest outcome read · supports keychecker (independent implementation): [A-Za-z0-9]{32} filter before a live AI21 check (2023-12-16) · #L242
- MCERQUA/LLM-Runner-Router @ dc020cfeb6ae071d5582bed6ce3563eea64ae8fd: src/auth/BYOKManager.jsscanner-rule-source · last read 2026-09-29 · latest outcome read · supports LLM-Runner-Router (independent implementation): ai21 keyFormat '[A-Za-z0-9]{32}' (2025-08-26) · #L287-L290
- Vulnetix/cli @ c6e24fc9b0148dc0a227da70774300fba7f339ee: internal/sast/rules/vnx-sec-315.regoscanner-rule-source · last read 2026-09-29 · latest outcome read · supports Vulnetix vnx-sec-315: ai21[_-]?api[_-]?key assignment + exactly [A-Za-z0-9]{32} (2026-06-14) · #L25
Tool corroborated ·
field-shape· current · observed 2026-09-26shape: 32 alphanumeric characters, no prefix (One peer rule and two independent implementations (redact-secret#1013); no provider statement. AI21-committed literals agree but are held for ruling Q-AI.)
- cunnymessiah/keychecker @ 122eadc6bdbbeec9f31e94878f98c4692d5b5718: main.pyscanner-rule-source · last read 2026-09-29 · latest outcome read · supports a 32-alphanumeric filter · #L242
- MCERQUA/LLM-Runner-Router @ dc020cfeb6ae071d5582bed6ce3563eea64ae8fd: src/auth/BYOKManager.jsscanner-rule-source · last read 2026-09-29 · latest outcome read · supports keyFormat '[A-Za-z0-9]{32}' · #L287-L290
- github.com/redact-secret/redact-secret/issues/784scanner-rule-source · last read 2026-09-26 · latest outcome read · supports ten-sample maintainer observation, values withheld
- redact-secret/redact-secret @ add1188fed9993723c59fbce8c867086b9d2049a: docs/audits/evidence/1013/ai21-api-key.mdscanner-rule-source · last read 2026-09-29 · latest outcome read · supports shape: 32 alphanumeric characters, no prefix
- Vulnetix/cli @ c6e24fc9b0148dc0a227da70774300fba7f339ee: internal/sast/rules/vnx-sec-315.regoscanner-rule-source · last read 2026-09-29 · latest outcome read · supports exactly [A-Za-z0-9]{32} after an ai21 key name · #L25
Provider documented ·
field-context· current · observed 2026-09-26context: a same-line AI21_API_KEY name, api.ai21.com host or AI21 SDK constructor
- AI21Labs/ai21-python @ main: ai21/ai21_env_config.pyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports _ENV_API_KEY = "AI21_API_KEY"
- AI21Labs/ai21-python @ main: ai21/http_client/base_http_client.pyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports Authorization: Bearer {api_key}
Unresolved ·
field-prefix-and-checksum· current · observed 2026-09-26prefix-and-checksum: no prefix or checksum was observed or documented
- github.com/redact-secret/redact-secret/issues/784scanner-rule-source · last read 2026-09-26 · latest outcome read · supports prefix-and-checksum: no prefix or checksum was observed or documented
- redact-secret/redact-secret @ add1188fed9993723c59fbce8c867086b9d2049a: docs/audits/evidence/1013/ai21-api-key.mdscanner-rule-source · last read 2026-09-29 · latest outcome read · supports prefix-and-checksum: no prefix or checksum was observed or documented
Unresolved ·
field-other-widths· current · observed 2026-09-26other-widths: a UUID (Kingfisher, deleted 2026-08-21) or 40-64 alphanumerics (octocode) (Excluded by the exact-32 contract; no fixture asserts either way.)
- redact-secret/redact-secret @ add1188fed9993723c59fbce8c867086b9d2049a: docs/audits/evidence/1013/ai21-api-key.mdscanner-rule-source · last read 2026-09-29 · latest outcome read · supports both readings contradict every AI21 literal found
Provider documented ·
field-non-secrets· current · observed 2026-09-26non-secrets: AI21_API_HOST, AI21_API_VERSION, AI21_AWS_REGION and the console's masked suffix are not credentials
- AI21Labs/ai21-python @ main: ai21/ai21_env_config.pyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports non-secrets: AI21_API_HOST, AI21_API_VERSION, AI21_AWS_REGION and the console's masked suffix are not credentials
Unresolved ·
listed-references· current · observed 2026-09-26The legacy contract lists 7 references without stating which property each supports.
- docs.ai21.com/docs/create-api-keyprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- docs.litellm.ai/docs/providers/ai21other · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret/issues/868issue-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/784scanner-rule-source · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- redact-secret/redact-secret @ add1188fed9993723c59fbce8c867086b9d2049a: docs/audits/evidence/1013/ai21-api-key.mdscanner-rule-source · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- AI21Labs/ai21-python @ main: ai21/ai21_env_config.pyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
- AI21Labs/ai21-python @ main: ai21/http_client/base_http_client.pyprovider-sdk-source · last read 2026-09-26 · latest outcome read · supports Listed as a reference by the legacy contract
Tool corroborated ·
dossier-research· current · observed 2026-09-29Legacy dossier research (verdict ready, tier T2) cited 5 sources; the dossier does not attribute sources to individual properties.
- AI21Labs/ai21-python @ bbc422f6f955134c2e33a9473ec0f71d21611764: examples/studio/batches/batches.pyother · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family · #L6
- cunnymessiah/keychecker @ 122eadc6bdbbeec9f31e94878f98c4692d5b5718: main.pyscanner-rule-source · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family · #L242
- MCERQUA/LLM-Runner-Router @ dc020cfeb6ae071d5582bed6ce3563eea64ae8fd: src/auth/BYOKManager.jsscanner-rule-source · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family · #L287-L290
- redact-secret/redact-secret @ add1188fed9993723c59fbce8c867086b9d2049a: docs/audits/evidence/1013/ai21-api-key.mdscanner-rule-source · last read 2026-09-29 · latest outcome read · supports Final research evidence recorded by the legacy dossier
- Vulnetix/cli @ c6e24fc9b0148dc0a227da70774300fba7f339ee: internal/sast/rules/vnx-sec-315.regoscanner-rule-source · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family · #L25
Unresolved ·
taxonomy-sources· current · observed 2026-09-29The legacy taxonomy lists 1 source for this family. The taxonomy records no date; the dossier researchedAt is used as the observed-at date.
- docs.ai21.com/docs/create-api-keyprovider-documentation · last read 2026-09-29 · 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
- no prefix; exactly 32 characters
[A-Za-z0-9], mixed case, recognised only beside a same-line AI21 name, host or SDK constructor (context-constrained, never bare). Not stated in provider prose. - Basis
- T2 on the corroborated route (redact-secret#1013, 2026-09-29), context-constrained. Without any provider material, three references from three owners in two non-summary classes clear the bar: - Vulnetix
vnx-sec-315(peer-scanner-rule, 2026-06-14):ai21[_-]?api[_-]?keyassignment + exactly 32[A-Za-z0-9]; - cunnymessiah/keychecker (independent-implementation, 2023-12-16): a 32-alphanumeric filter before a live AI21 check; - MCERQUA/LLM-Runner-Router (independent-implementation, 2025-08-26):ai21: { keyFormat: '[A-Za-z0-9]{32}' }. AI21 staff also committed key literals to AI21Labs example code (ai21-python 2024-08 to 2025-03, one pointing at a staging host; a 2023 AI21 demo app'sBearervalue): six literals, each 32 mixed alphanumerics, none a UUID. Their validity is unknown and was not tested. Whether a provider-committed literal of unknown validity counts as a provider example (R5) or as a leak is maintainer ruling Q-AI, pending; the T2 verdict holds without them, so they are recorded as bounded evidence pending Q-AI, not counted. Values are never reproduced. The 2026-09-27 ten-sample maintainer observation (#784) agrees and is kept as authoring input only. - Issuance
- not attempted. The #784 checklist covers length, charset, fixed segments, case mix, the masked suffix shown afterwards, and a second workspace.
- Contract in core
- detector-families.md, section Keyword-gated provider keys (#868). #774 lists it as
pending, needing "real issuance evidence, not more fixtures".
In this benchmark
- Fixtures
- 60
- Left readable
- 0
- Redacted too much
- 0
- False alarms
- 0
60 fixtures: 43 must stay quiet, 17 record project policy. See every row
| Evidence level | Fixtures | Left readable | Too much | False alarms |
|---|---|---|---|---|
| T2Tool-corroborated | 18 | 0 | 0 | 0 |
| T3Project policy | 42 | 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 | 60 | 16 | 1 | 0 |
| gitleaksRepository scanner · 8.30.1 · Directory scan · default rulesNo rule maps to it | 60 | 0 | 0 | 1 |
| redact-secretProduct measured here · 0.1.0-beta.14 · Published npm package · default detectors1 detector mapped | 60 | 0 | 0 | 0 |
| trufflehogRepository scanner · 3.97.4 · Filesystem scan · verification disabledNo rule maps to it | 60 | 17 | 0 | 0 |
Looks like it, but isn't
- Collisions
- MD5 and other 32-character hashes, UUIDs without dashes, session ids, other vendors' 32-byte keys, and the non-secret
AI21_API_HOST,AI21_API_VERSIONandAI21_AWS_REGIONvariables.
Scanner rules for this family
No peer rule maps to this family
None of the reviewed peer scanners has a rule that can match a credential of this family.
None mapped
Fixtures in this family
| Fixture | Kind and evidence | redact-secret |
|---|---|---|
ai21-api-key-actions-env-literalai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-compose-envai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-curl-headerai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-docker-run-envai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-dotenvai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-dotenv-altai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-exportai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-json-configai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-key-shape-bareai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-key-shape-quotedai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-key-shape-unicode-crlfai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-langchain-kwargai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-litellm-yamlai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-other-host-curl-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-proxy-logai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-python-ctorai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-tool-callai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-ts-ctorai21 · documented-format-literal | Project policyT3 · Project policy | Redacted |
ai21-api-key-actions-secret-referenceai21 · templated-reference | Must not flagT3 · Project policy | Quiet |
ai21-api-key-angle-key-placeholderai21 · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
ai21-api-key-bare-in-prose-near-missai21 · format-near-miss | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-bare-line-near-missai21 · format-near-miss | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-base64-text-encoded-valueai21 · benign-encoded-value | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-data-uri-encoded-valueai21 · benign-encoded-value | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-docs-ctor-placeholderai21 · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
ai21-api-key-embedded-run-near-missai21 · format-near-miss | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-env-reference-referenceai21 · templated-reference | Must not flagT3 · Project policy | Quiet |
ai21-api-key-id-named-compose-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-id-named-env-alt-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-id-named-env-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-id-named-export-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-id-named-json-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-id-named-kwarg-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-id-named-tool-call-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-key-guidance-proseai21 · prose-mention | Must not flagT3 · Project policy | Quiet |
ai21-api-key-key-shape-bare-twinai21 · wrong-length | Must not flagT2 · Tool-corroborated · twin | Quiet |
ai21-api-key-key-shape-quoted-twinai21 · wrong-length | Must not flagT2 · Tool-corroborated · twin | Quiet |
ai21-api-key-key-shape-unicode-crlf-twinai21 · wrong-length | Must not flagT2 · Tool-corroborated · twin | Quiet |
ai21-api-key-label-proseai21 · benign-lookalike | Must not flagT3 · Project policy | Quiet |
ai21-api-key-long-value-twinai21 · wrong-length | Must not flagT2 · Tool-corroborated · twin | Quiet |
ai21-api-key-maskai21 · benign-lookalike | Must not flagT3 · Project policy | Quiet |
ai21-api-key-missing-keywordai21 · benign-lookalike | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-model-id-public-idai21 · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-model-notes-proseai21 · prose-mention | Must not flagT3 · Project policy | Quiet |
ai21-api-key-object-id-public-idai21 · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-other-host-log-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-other-provider-model-twinai21 · missing-context-marker | Must not flagT3 · Project policy · twin | Quiet |
ai21-api-key-project-uuid-public-idai21 · public-identifier | Must not flagT2 · Tool-corroborated | Quiet |
ai21-api-key-python-environ-referenceai21 · templated-reference | Must not flagT3 · Project policy | Quiet |
ai21-api-key-referenceai21 · benign-lookalike | Must not flagT3 · Project policy | Quiet |
Sources
Documentation and code
- docs.ai21.com/docs/create-api-key
- github.com/Vulnetix/cli/blob/c6e24fc9b0148dc0a227da70774300fba7f339ee/internal/sast/rules/vnx-sec-315.rego#L25
- github.com/cunnymessiah/keychecker/blob/122eadc6bdbbeec9f31e94878f98c4692d5b5718/main.py#L242
- github.com/MCERQUA/LLM-Runner-Router/blob/dc020cfeb6ae071d5582bed6ce3563eea64ae8fd/src/auth/BYOKManager.js#L287-L290
- github.com/AI21Labs/ai21-python/blob/bbc422f6f955134c2e33a9473ec0f71d21611764/examples/studio/batches/batches.py#L6
Research log
- redact-secret/redact-secret#784Research issue
- redact-secret/redact-secret#774Research issue
- redact-secret/redact-secret#868Research issue
- redact-secret/redact-secret#1013Research issue
- redact-secret/redact-secret-benchmarks#384Research issue
- Final evidence, pinned to a commit/redact-secret/redact-secret/blob/add1188fed9993723c59fbce8c867086b9d2049a/docs/audits/evidence/1013/ai21-api-key.md