Airtable personal access token
high severity- Starts with
pat- Regex
pat[A-Za-z0-9]{14}\.[a-f0-9]{64}- Grants
- Read and write the bases in the token's scope.
- Revoke
- airtable.com/create/tokens
What credentials look like for 67 providers: the prefix to recognise, a regular expression that matches it, whether it is a live or test key, what an attacker can do with it, and where to revoke it. These are the same 95 signatures the API key detector and secret leak scanner run in your browser.
Updated
patpat[A-Za-z0-9]{14}\.[a-f0-9]{64}(?:algolia).{0,30}(?:admin|api)_?key.{0,10}['"]([a-f0-9]{32})['"]amqpsamqps?://[^:@\s]+:[^@\s]{3,}@[^\s/]+sk-ant-apisk-ant-api\d{2}-[A-Za-z0-9_-]{80,}[0-9]/[0-9]{16}:[a-f0-9]{32}ATATT3ATATT3[A-Za-z0-9_=-]{100,}(?:auth0).{0,30}(?:client_secret|secret).{0,10}['"]([A-Za-z0-9_-]{64})['"]\b((?:AKIA|ASIA|ABIA|ACCA|A3T[A-Z0-9])[A-Z0-9]{16})\bASIA marks a temporary STS credential.(?:aws.{0,20})?(?:secret|access).{0,20}['"]([A-Za-z0-9/+=]{40})['"](?:aws_session_token|x-amz-security-token)\s*[=:]\s*['"]?([A-Za-z0-9/+=]{100,})(?:AccountKey|storage.{0,20}key)\s*[=:]\s*['"]?([A-Za-z0-9+/]{86}==)DefaultEndpointsProtocol=httpsDefaultEndpointsProtocol=https?;AccountName=[^;]+;AccountKey=[^;]+access_tokenaccess_token\$production\$[0-9a-z]{16}\$[0-9a-f]{32}sk_sk_(?:live|test)_[A-Za-z0-9]{40,}(?:cloudflare|cf).{0,20}(?:token|key).{0,10}['"]([A-Za-z0-9_-]{40})['"]cloudinary://cloudinary://[0-9]{12,20}:[A-Za-z0-9_-]{20,}@[a-z0-9_-]+(?:datadog|dd).{0,20}(?:api|app)_key.{0,10}['"]([a-f0-9]{32,40})['"]dop_v1_dop_v1_[a-f0-9]{64}[MNO][A-Za-z\d_-]{23,25}\.[\w-]{6}\.[\w-]{27,38}https://https://(?:canary\.|ptb\.)?discord(?:app)?\.com/api/webhooks/[0-9]{17,20}/[A-Za-z0-9_-]{60,68}dckr_pat_dckr_pat_[A-Za-z0-9_-]{27}dp.dp\.(?:pt|st|sa|ct)\.[A-Za-z0-9]{40,44}figd_figd_[A-Za-z0-9_-]{40,}AAAAAAAA[A-Za-z0-9_-]{7}:[A-Za-z0-9_-]{140,}fm[12]_[A-Za-z0-9+/=]{40,}ghp_ghp_[A-Za-z0-9]{36}github_pat_github_pat_[A-Za-z0-9_]{82}gho_gho_[A-Za-z0-9]{36}ghs_ghs_[A-Za-z0-9]{36}ghr_ghr_[A-Za-z0-9]{36}glpat-glpat-[A-Za-z0-9_-]{20}api scope is granted.GR1348941GR1348941[A-Za-z0-9_-]{20}AIzaAIza[0-9A-Za-z_-]{35}[0-9]+-[0-9a-z_]{32}\.apps\.googleusercontent\.com"type""type"\s*:\s*"service_account"glc_glc_[A-Za-z0-9+/=]{32,}gsk_gsk_[A-Za-z0-9]{52}hv[sb]\.[A-Za-z0-9_-]{24,}[A-Za-z0-9]{14}\.atlasv1\.[A-Za-z0-9_-]{60,}(?:heroku).{0,20}['"]([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})['"]pat-pat-(?:na|eu)[0-9]-[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}hf_hf_[A-Za-z0-9]{34}dG9rOgdG9rOg[A-Za-z0-9+/=]{40,}lin_api_lin_api_[A-Za-z0-9]{40}[a-f0-9]{32}-us[0-9]{1,2}key-key-[a-f0-9]{32}EAAEAA[A-Za-z0-9]{80,}mongodbmongodb(?:\+srv)?://[^:@\s]+:[^@\s]{3,}@[^\s/]+mysql://mysql://[^:@\s]+:[^@\s]{3,}@[^\s/]+NRAK-NRAK-[A-Z0-9]{27}(?:secret_|ntn_)[A-Za-z0-9]{36,50}npm_npm_[A-Za-z0-9]{36}00[A-Za-z0-9_-]{40}sk-proj-sk-proj-[A-Za-z0-9_-]{40,}sk-sk-[A-Za-z0-9]{48}-----BEGIN OPENSSH PRIVATE KEY----------BEGIN OPENSSH PRIVATE KEY-----E[A-Za-z0-9_-]{20,}(?=[^A-Za-z0-9_-]|$)pplx-pplx-[a-f0-9]{48}-----BEGIN PGP PRIVATE KEY BLOCK----------BEGIN PGP PRIVATE KEY BLOCK-----postgrespostgres(?:ql)?://[^:@\s]+:[^@\s]{3,}@[^\s/]+PMAK-PMAK-[a-f0-9]{24}-[a-f0-9]{34}(?:postmark).{0,20}['"]([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})['"]pypi-AgEIcHlwaS5vcmcpypi-AgEIcHlwaS5vcmc[A-Za-z0-9_-]{50,}redisredis(?:s)?://[^:@\s]*:[^@\s]{3,}@[^\s/]+requirepass or the managed instance's credentials.r8_r8_[A-Za-z0-9]{37}re_re_[A-Za-z0-9_]{20,}rubygems_rubygems_[a-f0-9]{48}SG.SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}(?:sntrys_|sntryu_)[A-Za-z0-9+/=_]{40,}shpat_shpat_[a-fA-F0-9]{32}shpss_shpss_[a-fA-F0-9]{32}xoxb-xoxb-[0-9]{10,14}-[0-9]{10,14}-[A-Za-z0-9]{24,34}xoxp-xoxp-[0-9]{10,14}-[0-9]{10,14}-[0-9]{10,14}-[a-f0-9]{32}xapp-xapp-[0-9]-[A-Z0-9]+-[0-9]+-[a-f0-9]{64}https://hooks.slack.com/services/Thttps://hooks\.slack\.com/services/T[A-Za-z0-9_]{8,}/B[A-Za-z0-9_]{8,}/[A-Za-z0-9_]{24}(?:snyk).{0,20}(?:token|key).{0,10}['"]([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})['"]sq0atp-sq0atp-[0-9A-Za-z_-]{22}sq0csp-sq0csp-[0-9A-Za-z_-]{43}sk_live_sk_live_[0-9a-zA-Z]{24,247}rk_live_rk_live_[0-9a-zA-Z]{24,247}sk_test_sk_test_[0-9a-zA-Z]{24,247}pk_pk_(live|test)_[0-9a-zA-Z]{24,247}whsec_whsec_[a-zA-Z0-9]{32,64}(?:service_role|SUPABASE_SERVICE_ROLE_KEY)\s*[=:]\s*['"]?(eyJ[A-Za-z0-9_-]{20,})\b[0-9]{8,10}:[A-Za-z0-9_-]{35}\b(?:twilio).{0,20}['"]([a-f0-9]{32})['"]SK[a-f0-9]{32}AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA[A-Za-z0-9%]{50,}[a-z][a-z0-9+.-]{1,20}://[^/\s:@]{3,}:[^/\s:@]{3,}@[^\s]+-----BEGIN RSA PRIVATE KEY----------BEGIN RSA PRIVATE KEY----------BEGIN -----BEGIN (?:ENCRYPTED )?PRIVATE KEY----------BEGIN EC PRIVATE KEY----------BEGIN EC PRIVATE KEY-----eyJeyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}exp unless the issuer maintains a denylist. Rotate the signing key to invalidate all tokens.(?:api[_-]?key|apikey|secret|token|passwo?r?d|passwd|auth|credential|private[_-]?key)\s*[:=]\s*['"]([^'"\s]{8,})['"]\b[a-f0-9]{40,}\bMost modern keys start with a vendor prefix: sk_live_ and rk_live_ for Stripe, sk-proj- for OpenAI, sk-ant- for Anthropic, ghp_ for GitHub, xoxb- for Slack bots, AKIA for AWS access key IDs and AIza for Google API keys. Match the prefix and length against the table on this page, or paste the key into the API key detector, which runs the same patterns locally in your browser.
Long-term AWS access key IDs match AKIA followed by 16 uppercase letters and digits, and temporary ones from STS start with ASIA. The matching secret access key is 40 characters of Base64-like text with no prefix, so it cannot be reliably detected by format alone — scanners look for it near an access key ID or a variable name such as aws_secret_access_key.
A prefix adds no security, but it makes a key recognisable. Engineers can tell a live key from a test key at a glance, log scrubbers can redact it, and secret scanners such as GitHub's can detect a leaked key with very few false positives and notify the provider. If you issue your own keys, give them a distinctive prefix.
No. A pattern only tells you that a string has the shape of a given credential. Whether the key is active can only be confirmed by the provider. These patterns are for detection and classification — finding keys in code, logs and pastes — not for validation.
Identify a single key, scan a whole file, or test your own detector.
Identify which provider a key belongs to, what it grants, and how to revoke it.
Scan a diff, file or log for leaked credentials across 90+ provider signatures.
Test detection patterns against real text, or load a signature from the built-in library.
Produce format-accurate fake keys for OpenAI, Stripe, AWS, GitHub and others — for testing detectors.
Tell test credentials from live ones before you send a request with the wrong one.
Get the exact revocation commands, verification step and incident checklist for your provider.