redact-secret · Report
API key (rpa_)
rpa_ + at least 31 [A-Za-z0-9], open-ended: the provider scrubber's floor is 16 (R2), the floor of 31 is policy under R10 (it excludes Redirect.pizza rpa_ + 30), and the 128-byte cap is product policy.
Research record
3 events in the review history: 2 observed, 1 reviewed. Latest: observed on 2026-09-28 by automation, project maintainer. Project-maintained review is not independent validation. The family record at this release.
Format
What it looks like
- Descriptive pattern
^rpa_[A-Za-z0-9]{31,}$
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-29runpod/runpod-mcp src/alp/scrub.ts (added 2026-09-16, a provider-authored scrubber; R2): \brpa_[A-Za-z0-9]{16,}\b; the RunPod blog on scoped keys (2024-11): "Any new keys will be created with an rpa_ prefix"; re-checked 2026-09-28: rpa_ + [A-Za-z0-9], open-ended, provider floor 16; the contract floor 31 is policy under R10; no separator or checksum
- runpod/runpod-mcp @ 09a565a6adef8932f044dfa65243e7bc41cbdf2d: src/alp/scrub.tsprovider-documentation · last read 2026-09-29 · latest outcome read · supports rpa_ + [A-Za-z0-9], open-ended, provider floor 16; the contract floor 31 is policy under R10; no separator or checksum · #L36
Unresolved ·
tool-corroboration· current · observed 2026-09-29Pinned scanner rules are consistent with the contract grammar (1 artifact: betterleaks (unpinned)).
- github.com/betterleaks/betterleaksscanner-rule-source · last read 2026-09-29 · latest outcome read · supports betterleaks (unpinned): runpod.go: rpa_[A-Z0-9]{40}[A-Za-z0-9]{6} (tool-only, T2; the 46-byte layout is not part of the contract)
Provider documented ·
field-prefix· current · observed 2026-09-29prefix: rpa_
- runpod/runpod-mcp @ 09a565a6adef8932f044dfa65243e7bc41cbdf2d: src/alp/scrub.tsprovider-documentation · last read 2026-09-29 · latest outcome read · supports provider scrubber, R2 · #L36
- www.runpod.io/blog/scoped-api-keys-runpodprovider-documentation · last read 2026-09-29 · latest outcome read · supports "Any new keys will be created with an rpa_ prefix" (2024-11)
Provider documented ·
field-alphabet· current · observed 2026-09-29alphabet: [A-Za-z0-9]
- runpod/runpod-mcp @ 09a565a6adef8932f044dfa65243e7bc41cbdf2d: src/alp/scrub.tsprovider-documentation · last read 2026-09-29 · latest outcome read · supports provider-authored scrubber, R2 · #L36
Provider documented ·
field-provider-floor· current · observed 2026-09-29provider-floor: the provider scrubber's floor is 16 body bytes, open-ended (T1, but the contract floor is higher: see policy-floor.)
- github.com/redact-secret/redact-secret/issues/860issue-or-discussion · last read 2026-09-29 · latest outcome read · supports R2 · #issuecomment-5871306275
- runpod/runpod-mcp @ 09a565a6adef8932f044dfa65243e7bc41cbdf2d: src/alp/scrub.tsprovider-documentation · last read 2026-09-29 · latest outcome read · supports {16,} · #L36
Unresolved ·
field-policy-floor· current · observed 2026-09-29policy-floor: POLICY (R10), not T1: the contract floor is 31 body bytes, the first width above Redirect.pizza rpa_ + 30 (A policy boundary the handoff decides: the 30-byte twin asserts it and a 16-30 body is an accepted false negative. Every RunPod width seen is above it.)
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/runpod.mdprovider-documentation · last read 2026-09-29 · latest outcome read · supports supported shape: policy floor 31
- github.com/redact-secret/redact-secret/issues/860issue-or-discussion · last read 2026-09-29 · latest outcome read · supports R10: policy fills a partly stated grammar, at least as wide as the provider class · #issuecomment-5880547337
Unresolved ·
field-policy-upper-bound· current · observed 2026-09-29policy-upper-bound: POLICY, not T1: the product caps the run at 128 bytes; an over-cap run is rejected whole, never truncated (Not a provider fact, and the provider scrubber is open-ended: positives reach 128 and no fixture asserts silence on 129.)
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/runpod.mdprovider-documentation · last read 2026-09-29 · latest outcome read · supports supported shape: project policy, the Apify precedent
Tool corroborated ·
field-observed-layout· current · observed 2026-09-29observed-layout: every observed body is 46 bytes: 40 uppercase-or-digit then 6 mixed alphanumerics (Not part of the contract; positives are authored in the 46-byte layout and outside it.)
- github.com/betterleaks/betterleaksscanner-rule-source · last read 2026-09-29 · latest outcome read · supports rpa_[A-Z0-9]{40}[A-Za-z0-9]{6}, unpinned
- github.com/runpod/docs/pull/456scanner-rule-source · last read 2026-09-29 · latest outcome read · supports a withdrawn 48-character docs example
Unresolved ·
field-boundary· current · observed 2026-09-29boundary: a key glued to an identifier on either side ([A-Za-z0-9_-]) is not claimed; a _ or - glued after the run rejects the match (Handoff boundary decision, not a provider statement.)
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/runpod.mdprovider-documentation · last read 2026-09-29 · latest outcome read · supports implementation notes
Provider documented ·
field-transport· current · observed 2026-09-29transport: the RUNPOD_API_KEY environment variable, sent as Authorization: Bearer; runpod.api_key = "..." and runpodctl config --apiKey
- docs.runpod.io/get-started/api-keysprovider-documentation · last read 2026-09-29 · latest outcome read · supports transport: the RUNPOD_API_KEY environment variable, sent as Authorization: Bearer; runpod.api_key = "..." and runpodctl config --apiKey
Unresolved ·
field-other-credentials· current · observed 2026-09-29other-credentials: S3-compatible rps_ secrets and access keys, and legacy unprefixed keys, are separate credentials with no researched shape (Not this family; an rps_ value is a benign control, never a positive.)
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/runpod.mdprovider-documentation · last read 2026-09-29 · latest outcome read · supports excluded shapes
Tool corroborated ·
field-peer-lag· current · observed 2026-09-29peer-lag: no RunPod rule in trufflehog 3.97.4 or gitleaks 8.30.1; betterleaks (unpinned, not measured here) uses rpa_[A-Z0-9]{40}[A-Za-z0-9]{6}, which is narrower than the contract (misses a lowercase or non-46 body) and would not match Redirect.pizza rpa_ + 30 either
- github.com/betterleaks/betterleaksscanner-rule-source · last read 2026-09-29 · latest outcome read · supports runpod.go, observed 2026-09-28; unpinned
- gitleaks/gitleaks @ v8.30.1: config/gitleaks.tomlscanner-rule-source · last read 2026-10-04 · latest outcome read · supports no runpod rule
- trufflesecurity/trufflehog @ v3.97.4: pkg/detectorsscanner-rule-source · last read 2026-09-29 · latest outcome read · supports no runpod detector directory at the pinned version
Unresolved ·
listed-references· current · observed 2026-09-29The legacy contract lists 13 references without stating which property each supports.
- docs.runpod.io/get-started/api-keysprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/runpod.mdprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/issuance-research/runpod.mdproject-research-note · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/README.mdproject-research-note · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret/issues/974issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret/issues/860issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #issuecomment-5871306275
- github.com/redact-secret/redact-secret/issues/860issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #issuecomment-5880547337
- github.com/redact-secret/redact-secret/issues/860issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/redact-secret/redact-secret-benchmarks/issues/464issue-or-discussion · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/tier-b-rerank.mdproject-research-note · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- github.com/runpod/docs/pull/456scanner-rule-source · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
- runpod/runpod-mcp @ 09a565a6adef8932f044dfa65243e7bc41cbdf2d: src/alp/scrub.tsprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract · #L36
- www.runpod.io/blog/scoped-api-keys-runpodprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a reference by the legacy contract
Provider documented ·
dossier-research· current · observed 2026-09-28Legacy dossier research (verdict ready, tier T1) cited 3 sources; the dossier does not attribute sources to individual properties.
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/runpod.mdprovider-documentation · last read 2026-09-29 · latest outcome read · supports Final research evidence recorded by the legacy dossier
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/issuance-research/runpod.mdproject-research-note · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family
- runpod/runpod-mcp @ 09a565a6adef8932f044dfa65243e7bc41cbdf2d: src/alp/scrub.tsprovider-documentation · last read 2026-09-29 · latest outcome read · supports Cited by the legacy dossier research for this family · #L36
Provider documented ·
taxonomy-sources· current · observed 2026-09-28The legacy taxonomy lists 2 sources for this family. The taxonomy records no date; the dossier researchedAt is used as the observed-at date.
- redact-secret/redact-secret @ 8b6a5fde52ecb4dfce13f09c7a947062d21483c7: docs/audits/evidence/860/runpod.mdprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a source for this family in the legacy taxonomy
- runpod/runpod-mcp @ 09a565a6adef8932f044dfa65243e7bc41cbdf2d: src/alp/scrub.tsprovider-documentation · last read 2026-09-29 · latest outcome read · supports Listed as a source for this family in the legacy taxonomy · #L36
Open questions
No open question is recorded for this revision.
Benchmark dossier notes
- Shape
- prefix
rpa_, then at least 31 alphanumeric characters[A-Za-z0-9], open-ended. The floor of 31 (ruling R10) and the 128-byte cap are project policy; the provider floor is 16. - Basis
- prefix T1 (the RunPod blog on scoped keys, 2024-11) and alphabet and provider floor of 16 T1 under R2 (a provider-authored scrubber in
runpod/runpod-mcp, 2026-09-16). The 46-byte body and the 40-uppercase/6-mixed layout are tool (betterleaks) and empirical facts, not part of the contract. - Issuance
- not attempted; a uniform 46 across an All key and a Read Only key would allow an exact-width contract later, as a separate optional change.
- Contract in core
- detector-families.md (no row until the Beta.12 detector, redact-secret#974, is merged).
In this benchmark
- Fixtures
- 36
- Left readable
- 0
- Redacted too much
- 0
- False alarms
- 0
36 fixtures: 16 expect a redaction, 20 must stay quiet. See every row
| Evidence level | Fixtures | Left readable | Too much | False alarms |
|---|---|---|---|---|
| T1Provider-documented | 16 | 0 | 0 | 0 |
| T2Tool-corroborated | 11 | 0 | 0 | 0 |
| T3Project policy | 9 | 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 | 36 | 14 | 2 | 0 |
| gitleaksRepository scanner · 8.30.1 · Directory scan · default rulesNo rule maps to it | 36 | 7 | 0 | 0 |
| redact-secretProduct measured here · 0.1.0-beta.14 · Published npm package · default detectors1 detector mapped | 36 | 0 | 0 | 0 |
| trufflehogRepository scanner · 3.97.4 · Filesystem scan · verification disabledNo rule maps to it | 36 | 16 | 0 | 0 |
Benchmark dossier questions
- Open caveat
- the floor and the cap are policy; a RunPod key with a body of 16 to 30 (none known) is an accepted false negative; legacy unprefixed keys and
rps_secrets are outside the family.
Looks like it, but isn't
- Collisions
- a floor of 16 would claim Redirect.pizza's
rpa_+ 30 tokens, so R10 raises it to 31; a longer Redirect.pizza token, if one exists, would read as RunPod (misattributed, still redacted).rps_S3-compatible secrets are another credential.
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 |
|---|---|---|
runpod-api-key-bare-proserunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-bearer-headerrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-chat-pasterunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-curl-graphql-bearerrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-dotenvrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-exportrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-json-api-keyrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-json-tokenrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-key-shape-barerunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-key-shape-quotedrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-key-shape-unicode-crlfrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-mcp-envrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-python-modulerunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-runpodctl-configrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-sdk-kwargrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-x-api-key-headerrunpod · documented-format-literal | Must redactT1 · Provider-documented | Redacted |
runpod-api-key-actions-secret-referencerunpod · templated-reference | Must not flagT3 · Project policy | Quiet |
runpod-api-key-body-30-policy-floor-twinrunpod · wrong-length | Must not flagT2 · Tool-corroborated · twin | Quiet |
runpod-api-key-ellipsis-placeholderrunpod · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
runpod-api-key-env-reference-referencerunpod · templated-reference | Must not flagT3 · Project policy | Quiet |
runpod-api-key-hyphen-prefix-twinrunpod · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
runpod-api-key-key-guidance-proserunpod · prose-mention | Must not flagT3 · Project policy | Quiet |
runpod-api-key-label-proserunpod · benign-lookalike | Must not flagT3 · Project policy | Quiet |
runpod-api-key-leading-glue-twinrunpod · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
runpod-api-key-leading-underscore-twinrunpod · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
runpod-api-key-maskrunpod · benign-lookalike | Must not flagT3 · Project policy | Quiet |
runpod-api-key-prefix-at-eol-near-missrunpod · format-near-miss | Must not flagT2 · Tool-corroborated | Quiet |
runpod-api-key-prefix-onlyrunpod · benign-lookalike | Must not flagT2 · Tool-corroborated | Quiet |
runpod-api-key-referencerunpod · benign-lookalike | Must not flagT3 · Project policy | Quiet |
runpod-api-key-short-bodyrunpod · benign-lookalike | Must not flagT2 · Tool-corroborated | Quiet |
runpod-api-key-trailing-hyphen-twinrunpod · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
runpod-api-key-trailing-underscore-twinrunpod · boundary-violation | Must not flagT2 · Tool-corroborated · twin | Quiet |
runpod-api-key-truncated-near-missrunpod · format-near-miss | Must not flagT2 · Tool-corroborated | Quiet |
runpod-api-key-uppercase-prefix-twinrunpod · prefix-near-miss | Must not flagT2 · Tool-corroborated · twin | Quiet |
runpod-api-key-word-fixture-placeholderrunpod · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
runpod-api-key-x-run-placeholderrunpod · documentation-placeholder | Must not flagT3 · Project policy | Quiet |
Sources
Documentation and code
- github.com/runpod/runpod-mcp/blob/09a565a6adef8932f044dfa65243e7bc41cbdf2d/src/alp/scrub.ts#L36
- github.com/redact-secret/redact-secret/blob/8b6a5fde52ecb4dfce13f09c7a947062d21483c7/docs/audits/evidence/860/runpod.md
- github.com/redact-secret/redact-secret/blob/8b6a5fde52ecb4dfce13f09c7a947062d21483c7/docs/audits/evidence/860/issuance-research/runpod.md
Research log
- redact-secret/redact-secret#860Research issue
- redact-secret/redact-secret#974Research issue
- redact-secret/redact-secret-benchmarks#464Research issue
- Final evidence, pinned to a commit/redact-secret/redact-secret/blob/8b6a5fde52ecb4dfce13f09c7a947062d21483c7/docs/audits/evidence/860/runpod.md