Keller Williams · Authentication Profile

Keller Williams Authentication

Authentication

Keller Williams secures its APIs with apiKey, http, oauth2, and openIdConnect across 4 declared security schemes, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode, implicit, clientCredentials, tokenExchange, jwtBearer, and refreshToken flow(s).

Real EstateUnited StatesResidential Real EstateBrokerageFranchiseProperty ListingsPropTechAgent PlatformCRMPartner APIsMarketplaceAustin Texas
Methods: apiKey, http, oauth2, openIdConnect Schemes: 4 OAuth flows: authorizationCode, implicit, clientCredentials, tokenExchange, jwtBearer, refreshToken API key in: header

Security Schemes

apiKeyHeader apiKey
· in: header (api-key)
basicAuth http
scheme: basic
bearerAuth http
scheme: bearer
openIdConnect openIdConnect

Source

Authentication Profile

Raw ↑
generated: '2026-07-26'
method: searched
docs: https://developer.kw.com/docs-authentication
source:
  - https://developer.kw.com/getting-started
  - https://developer.kw.com/docs-getting-started
  - https://developer.kw.com/docs-authentication
  - https://developer.kw.com/docs-refresh-token
  - https://partners.api.kw.com/idp/.well-known/openid-configuration
  - openapi/keller-williams-listings-search-openapi.json
summary:
  types: [apiKey, http, oauth2, openIdConnect]
  api_key_in: [header]
  api_key_names: [api-key, API-Key]
  http_schemes: [basic, bearer]
  oauth2_flows: [authorizationCode, implicit, clientCredentials, tokenExchange, jwtBearer, refreshToken]
  paired_credentials: true
  note: >-
    Every Keller Williams partner request carries TWO credentials: the
    application's `api-key` header (the DevHub app API Key) and an
    `Authorization` header. Which Authorization credential depends on the
    resource: user-owned Command data uses an OAuth 2.0 / OpenID Connect
    Bearer access token minted for one individual KW user; non-user-scoped
    or more public resources use HTTP Basic with
    base64(API_KEY:API_SECRET). The published Listings OpenAPI declares NO
    `components.securitySchemes` at all — authorization is modelled as an
    explicit required `Authorization` header parameter on all seven
    operations, described as "Basic token is created by base 64 encoding
    your credentials: <Basic base64Encode(API_KEY:API_SECRET)>". That is a
    real contract-quality gap: a machine reading the spec alone cannot
    discover the api-key header or the OAuth flows at all.
credential_issuance:
  self_serve: false
  process:
    - Submit a partnership application via the "Apply to Integrate" HubSpot form.
    - KWRI reviews and approves; a DevHub account is provisioned (SAML sign-in).
    - Sign the KW API License Agreement and the DevHub Terms and Conditions.
    - Create an App in DevHub (name, description, owner or team, selected APIs + scopes, one callback URL).
    - API Key and Secret are revealed on the app record; only Owner and App Admin roles can view the Secret.
    - Keys can be rotated ("Add Key") and revoked ("Revoke") from the app record.
  callback_urls: one per application (redirect URI must be https)
  teams: Owner / Administrator / Viewer permission levels
schemes:
  - name: apiKeyHeader
    type: apiKey
    in: header
    parameter: api-key
    aliases: [API-Key]
    applies_to: all partner gateway requests
    source: https://developer.kw.com/docs-authentication
  - name: basicAuth
    type: http
    scheme: basic
    value: base64(API_KEY:API_SECRET)
    applies_to: >-
      Resources that are not scoped to an individual KW user, the Listings
      Search API as documented in its OpenAPI, and the client
      authentication leg of /idp/token and /idp/revoke.
    source: openapi/keller-williams-listings-search-openapi.json
  - name: bearerAuth
    type: http
    scheme: bearer
    bearerFormat: JWT
    applies_to: user-owned Command data (contacts, tasks, opportunities, listings, marketing profiles)
    source: https://developer.kw.com/docs-getting-started
  - name: openIdConnect
    type: openIdConnect
    openIdConnectUrl: https://partners.api.kw.com/idp/.well-known/openid-configuration
    issuer: https://partners.api.kw.com
    id_token_signing_alg: [RS256]
    subject_types: [public]
    pkce: [S256]
    response_types: [code, id_token, "id_token token"]
    grant_types:
      - authorization_code
      - implicit
      - refresh_token
      - client_credentials
      - urn:ietf:params:oauth:grant-type:token-exchange
      - urn:ietf:params:oauth:grant-type:jwt-bearer
    token_endpoint_auth_methods: [none, client_secret_basic, client_secret_post]
    scopes: scopes/keller-williams-scopes.yml
    endpoints:
      authorize: https://partners.api.kw.com/idp/authorize
      token: https://partners.api.kw.com/idp/token
      introspect: https://partners.api.kw.com/idp/introspect
      userinfo: https://partners.api.kw.com/idp/userinfo
      revoke: https://partners.api.kw.com/idp/revoke
      end_session: https://partners.api.kw.com/idp/end_session
      device_authorization: https://partners.api.kw.com/idp/device_authorization
      jwks_uri: https://partners.api.kw.com/idp/keys
    jwks_note: >-
      The advertised jwks_uri returns HTTP 404 ("Resourse not supported.")
      to an anonymous client, so ID-token signature verification keys are
      not publicly retrievable. Probed 2026-07-26.
token_lifetimes:
  access_token: 2 days
  refresh_token: 365 days
  rotation: >-
    Refresh tokens are single-use — refreshing invalidates the old refresh
    token and returns a new one in the same payload.
  expired_refresh: Contact KW; a new refresh token cannot be self-issued.
  docs: https://developer.kw.com/docs-authentication
partner_token_refresh:
  endpoint: https://partners.api.kw.com/v2/oauth2/partner/token
  method: POST
  content_type: application/x-www-form-urlencoded
  auth: Basic <base64 API_KEY:API_SECRET> + api-key header
  parameters: [grant_type=refresh_token, account_identifier, refresh_token]
  response_fields:
    - access_token
    - refresh_token
    - refresh_token_expires_in
    - refresh_token_status
    - refresh_token_issued_at
    - refresh_count
    - old_access_token_life_time
    - token_type
    - expires_in
    - issued_at
    - status
    - client_id
    - application_name
    - organization_name
    - developer.email
  docs: https://developer.kw.com/docs-refresh-token
marketplace_token_minting:
  note: >-
    For KW Marketplace integrations, per-user access and refresh tokens
    are not obtained through the /authorize redirect at all — they are
    delivered to the partner inside the SUBSCRIPTION_ORDER and
    USER_ASSIGNMENT webhook payloads as `access-token` and
    `refresh-token` fields. See asyncapi/keller-williams-marketplace-webhooks.yml.
  docs: https://developer.kw.com/docs-getting-started
transport:
  https_required: true
  note: Calls made over plain HTTP fail; unauthenticated requests fail.
authorization_model:
  granularity: path + verb pair
  note: >-
    KW describes a fine-grained access policy where a resource is defined
    by a path and verb pair — GET /v3/contacts and POST /v3/contacts are
    granted separately, per partnership.
  docs: https://developer.kw.com/docs-getting-started