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
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