Snowflake · Authentication Profile

Snowflake Authentication

Authentication

Snowflake secures its APIs with http-bearer and oauth2 across 4 declared security schemes, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode and implicit flow(s).

DataData WarehouseData LakehouseCloud Data PlatformAnalyticsArtificial IntelligenceData EngineeringData GovernanceSQLApache IcebergModel Context ProtocolT1
Methods: http-bearer, oauth2 Schemes: 4 OAuth flows: authorizationCode, implicit API key in:

Security Schemes

KeyPair
SnowflakeOAuth
· flows: authorizationCode, implicit
ExternalOAuth
ProgrammaticAccessToken

Source

Authentication Profile

Raw ↑
generated: '2026-09-03'
method: searched
source: >-
  Baseline derived by 0-working/derive-authentication.py from the securitySchemes declared in all
  47 OpenAPI documents under openapi/, then upgraded from Snowflake's own authentication
  documentation. The specs declare four schemes on essentially every operation; three of the four
  are typed `apiKey`/`http` or left untyped in the contract, so the semantics below come from the
  docs rather than from the spec.
docs:
  - https://docs.snowflake.com/en/developer-guide/sql-api/authenticating
  - https://docs.snowflake.com/en/user-guide/key-pair-auth
  - https://docs.snowflake.com/en/user-guide/oauth-custom
  - https://docs.snowflake.com/en/user-guide/oauth-ext-overview
  - https://docs.snowflake.com/en/user-guide/programmatic-access-tokens
provider: Snowflake
providerId: snowflake

summary:
  scheme_count: 4
  types: [http-bearer, oauth2]
  oauth2_flows: [authorizationCode, implicit]
  transport: Authorization request header, Bearer scheme
  coverage: >-
    All four schemes are declared on effectively every operation across the 47 specs — Snowflake
    factors security into a shared block rather than varying it per resource. There is no
    operation in the corpus that accepts anonymous access.

critical_detail:
  header: X-Snowflake-Authorization-Token-Type
  required: true
  description: >-
    Snowflake does not infer the credential type from the token. Every request must carry a
    second header naming which of the four kinds the bearer value is. Omitting it is the most
    common 401 on this API and it produces an error that reads like a bad token rather than a
    missing header.
  values:
    - KEYPAIR_JWT
    - OAUTH
    - PROGRAMMATIC_ACCESS_TOKEN
  source: openapi/common.yaml#/components/parameters/x-snowflake-authorization-token-type

schemes:
  - name: KeyPair
    kind: rsa-key-pair-jwt
    transport: 'Authorization: Bearer <JWT>'
    token_type_header: KEYPAIR_JWT
    docs: https://docs.snowflake.com/en/user-guide/key-pair-auth
    description: >-
      The customer generates an RSA key pair, registers the public key on a Snowflake user, and
      signs a short-lived JWT with the private key. No secret is ever sent to Snowflake and no
      interactive consent is involved, which makes this the standard choice for services,
      pipelines and agents.
    rotation: >-
      Snowflake supports two registered public keys per user (RSA_PUBLIC_KEY and
      RSA_PUBLIC_KEY_2) specifically so a key can be rotated without downtime.
    interactive: false
    declared_in_spec_as: untyped in the harvested contract; documented as key-pair JWT
    recommended_for: [service accounts, CI, agents, unattended workloads]
  - name: SnowflakeOAuth
    kind: oauth2
    transport: 'Authorization: Bearer <access_token>'
    token_type_header: OAUTH
    docs: https://docs.snowflake.com/en/user-guide/oauth-custom
    description: >-
      Snowflake acts as the OAuth authorization server for a security integration the customer
      creates in the account.
    flows:
      - flow: authorizationCode
        authorizationUrl: https://org-account.snowflakecomputing.com/oauth/authorize
        tokenUrl: https://org-account.snowflakecomputing.com/oauth/token-request
      - flow: implicit
        authorizationUrl: /oauth/authorize
        caution: >-
          Declared in the SQL API contract. The implicit flow is removed in OAuth 2.1 and
          discouraged by current IETF security best practice; use authorizationCode with PKCE.
    interactive: true
    scopes: scopes/snowflake-scopes.yml
    recommended_for: [end-user applications, tools acting on behalf of a signed-in person]
  - name: ExternalOAuth
    kind: oauth2
    transport: 'Authorization: Bearer <access_token>'
    token_type_header: OAUTH
    docs: https://docs.snowflake.com/en/user-guide/oauth-ext-overview
    description: >-
      An external identity provider — Okta, Microsoft Entra ID, Ping, or a custom OIDC provider —
      issues the token and Snowflake validates it, mapping a claim to a Snowflake user. Snowflake
      is the RELYING PARTY, not the authorization server.
    interactive: true
    note: >-
      This is why no /.well-known/openid-configuration is served on any Snowflake host: Snowflake
      consumes OIDC discovery documents, it does not publish one. See
      well-known/snowflake-well-known.yml.
    recommended_for: [enterprises with central IdP-governed access, SSO-first estates]
  - name: ProgrammaticAccessToken
    kind: bearer-token
    transport: 'Authorization: Bearer <pat>'
    token_type_header: PROGRAMMATIC_ACCESS_TOKEN
    docs: https://docs.snowflake.com/en/user-guide/programmatic-access-tokens
    description: >-
      A long-lived token issued against a Snowflake user and bound to a role, for scripts and
      tools that cannot run an OAuth flow or manage a key pair.
    interactive: false
    caution: >-
      A PAT is a bearer secret in a file. Snowflake's own MCP documentation explicitly recommends
      against hardcoded tokens and, where a PAT is used, that it be scoped to a least-privileged
      role. Prefer KeyPair for anything unattended.
    recommended_for: [scripts, quick integrations, CLI use where key-pair setup is impractical]

authorization_model:
  type: RBAC
  note: >-
    Authentication establishes WHO. Authorization is entirely Snowflake RBAC: privileges granted
    to roles, roles granted to users and to other roles. No credential type carries permissions of
    its own, and OAuth scopes only select which role the session runs as. The practical
    consequence: to constrain an integration you create a dedicated role with exactly the grants
    it needs — narrowing the credential does nothing on its own.
  docs: https://docs.snowflake.com/en/user-guide/security-access-control-overview
  scopes: scopes/snowflake-scopes.yml

network_controls:
  note: >-
    Snowflake layers network-level restriction on top of credentials, manageable over the same
    REST API.
  mechanisms:
    - name: Network policies
      operations: [createNetworkPolicy, listNetworkPolicies, fetchNetworkPolicy, deleteNetworkPolicy]
      spec: openapi/snowflake-network-policy-api-openapi.yml
      description: Allow/deny lists of IP ranges at the account or user level.
    - name: Network rules
      operations: [createNetworkRule, listNetworkRules, fetchNetworkRule, deleteNetworkRule]
      spec: openapi/snowflake-network-rule-api-openapi.yml
    - name: Private connectivity
      description: >-
        AWS PrivateLink, Azure Private Link and Google Private Service Connect, available on
        Business Critical Edition and above. See plans/snowflake-plans-pricing.yml.

identity_provisioning:
  standard: SCIM 2.0
  endpoint: https://<account>.snowflakecomputing.com/scim/v2/
  docs:
    - https://docs.snowflake.com/en/user-guide/scim-user-api-reference
    - https://docs.snowflake.com/en/user-guide/scim-group-api-reference
  note: >-
    Users and roles can be provisioned from an IdP over a standards-conformant SCIM 2.0 surface
    carrying real IETF SCIM URNs. This surface has no OpenAPI in openapi/ — it is documented in
    prose only. See conformance/snowflake-conformance.yml.

failure_modes:
  - status: 401
    causes:
      - Missing or expired token
      - Missing X-Snowflake-Authorization-Token-Type header
      - JWT signed with a key not registered on the user
      - JWT issuer/subject not matching the account and user
  - status: 403
    causes:
      - The session's role lacks the privilege on the object
      - The REST API is not enabled on the account (Snowflake's own 403 description says so)
      - A network policy blocked the source IP

Work with this as data

Every security artifact here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for security posture

4 MCP tools reach this
  • find_securityBrowse and filter every security artifact in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This security artifact
curl "https://apis.io/api/v1/security/snowflake-authentication"
All security posture
curl "https://apis.io/api/v1/security?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.