In general, the Deploy CLI resource configuration files closely match the payload schemas of the Management API.
However, there are some notable nuances to be aware of:
The Deploy CLI's own client grant is intentionally not exported nor configurable by itself. This is done to prevent breaking changes, otherwise the tool could potentially revoke access or otherwise crash in the midst of an import. In a multi-tenant, multi-environment context, it is expect that new tenants will have a designated client already established for the Deploy CLI, as mentioned in the getting started instructions.
Client grants support a subject_type field, which is one of client, user, or anonymous_user. Setting subject_type: anonymous_user authorizes a client to obtain anonymous-session access tokens for the given audience. This is the grant that a resource server's require_client_grant anonymous policy checks for (see the Resource Servers section below).
subject_type is immutable. If the subject_type of an existing grant changes, the Deploy CLI deletes the old grant and creates a new one rather than updating it in place.
subject_type(string): One ofclient,user,anonymous_user.
clientGrants:
- client_id: My Application
audience: https://api.example.com/
subject_type: anonymous_user
scope:
- read:widgetsThe prompts resource allows you to configure Universal Login pages, including custom text, custom HTML partials, and screen renderers.
Custom Text: Multilingual text translations follow a hierarchy - language code → prompt ID → screen ID → text ID.
Partials: Custom HTML that can be injected at specific insertion points in prompts.
Screen Renderers: Configure rendering settings for specific prompt-screen combinations. Refer to the Advanced Customizations documentation for more details.
YAML Example
Folder structure when in YAML mode.
./prompts/
/screenRenderSettings
/signup-id_signup-id.json
/login-id_login-id.json
/login-passwordless_login-passwordless-email-code.json
/login-passwordless_login-passwordless-sms-otp.json
./tenant.yaml
# Contents of ./tenant.yaml
prompts:
identifier_first: false
universal_login_experience: new
webauthn_platform_first_factor: false
customText:
en:
login:
login:
description: Login description in english
buttonText: Button text
passkeys:
passkey-enrollment:
title: Create a passkey for ${clientName}
createButtonText: Create a passkey
partials:
login:
login:
form-content-start: |
<div class="custom-login-banner">
<p>Welcome! Please log in to continue.</p>
</div>
passkeys:
passkeys-enrollment:
form-content-start: |
<div class="passkey-enrollment-header">
<p>Enhance your account security by creating a passkey.</p>
</div>
passkeys-enrollment-local:
form-footer-end: |
<div class="passkey-local-enrollment-info">
<p>This passkey will be saved to this device only.</p>
</div>
screenRenderers:
- signup-id:
signup-id: ./prompts/screenRenderSettings/signup-id_signup-id.json
- login-passwordless:
login-passwordless-email-code: ./prompts/screenRenderSettings/login-passwordless_login-passwordless-email-code.json
login-passwordless-sms-otp: ./prompts/screenRenderSettings/login-passwordless_login-passwordless-sms-otp.jsonDirectory example:
Folder structure when in directory mode.
./prompts/
./partials/
./login/
./login/
./form-content-start.liquid
./passkeys/
./passkeys-enrollment/
./form-content-start.liquid
./passkeys-enrollment-local/
./form-footer-end.liquid
./screenRenderSettings/
./signup-id_signup-id.json
./login-id_login-id.json
./login-passwordless_login-passwordless-email-code.json
./login-passwordless_login-passwordless-sms-otp.json
./login-password_login-password.json
./signup-password_signup-password.json
./custom-text.json
./partials.json
./prompts.json
In directory mode, partials.json is a manifest that maps each insertion point to its .liquid file (paths are relative to the prompts/ directory):
Contents of custom-text.json:
{
"en": {
"login": {
"login": {
"description": "Login description in english",
"buttonText": "Button text"
}
},
"passkeys": {
"passkey-enrollment": {
"title": "Create a passkey for ${clientName}",
"createButtonText": "Create a passkey"
}
}
}
}Contents of partials.json:
{
"login": [
{
"login": [
{
"name": "form-content-start",
"template": "partials/login/login/form-content-start.liquid"
}
]
}
],
"passkeys": [
{
"passkeys-enrollment": [
{
"name": "form-content-start",
"template": "partials/passkeys/passkeys-enrollment/form-content-start.liquid"
}
],
"passkeys-enrollment-local": [
{
"name": "form-footer-end",
"template": "partials/passkeys/passkeys-enrollment-local/form-footer-end.liquid"
}
]
}
]
}Contents of partials/login/login/form-content-start.liquid:
<div class="login-notice">
Welcome back! Please log in to continue.
</div>Contents of partials/passkeys/passkeys-enrollment/form-content-start.liquid:
<div class="passkey-enrollment-header">
<p>Enhance your account security by creating a passkey.</p>
<p>Passkeys provide a faster and more secure way to sign in.</p>
</div>Contents of screenRenderSettings/signup-id_signup-id.json:
{
"prompt": "signup-id",
"screen": "signup-id",
"rendering_mode": "advanced",
"context_configuration": ["branding.settings", "branding.themes.default"],
"default_head_tags_disabled": false,
"head_tags": [
{
"tag": "script",
"attributes": {
"src": "URL_TO_YOUR_ASSET",
"async": true,
"defer": true,
"integrity": ["ASSET_SHA"]
}
}
],
"filters": {
"match_type": "includes_any",
"clients": [
{
"id": "SeunfRe6p8EXxV6I0g9kMYdT1DxpfC38",
"metadata": { "key1": "value1" }
}
]
},
"use_page_template": false
}The Deploy CLI supports managing the directory_provisioning_configuration for Google Workspace (google-apps) connections. Only google-apps connections are processed for directory provisioning; other strategies will ignore this block. Deleting directory provisioning requires AUTH0_ALLOW_DELETE=true.
The mapping array pairs Auth0 user fields with IdP fields, and synchronize_automatically controls whether Auth0 runs scheduled sync jobs for the connection.
The synchronize_groups field controls group provisioning. Accepted values are off, all, and selected. When set to selected, the synchronized_groups array specifies which Google Workspace groups to sync. Each group object contains id (required) and optional metadata fields name, email, and direct_members_count populated by the API.
YAML Example
connections:
- name: google-workspace
strategy: google-apps
options:
domain: example.com
tenant_domain: example.com
client_id: 'some_client_id'
client_secret: 'some_client_secret'
api_enable_groups: true
api_enable_users: true
directory_provisioning_configuration:
mapping:
- auth0: email
idp: mail
- auth0: name
idp: displayName
synchronize_automatically: false
synchronize_groups: selected
synchronized_groups:
- id: 'group-id-1'
name: 'Engineering'
email: 'engineering@example.com'
direct_members_count: 42
- id: 'group-id-2'
name: 'Design'
email: 'design@example.com'
direct_members_count: 10Directory Example
./connections/google-apps-directory-provisioning.json
{
"name": "google-apps-directory-provisioning",
"strategy": "google-apps",
"enabled_clients": ["My SPA"],
"options": {
"domain": "example.com",
"tenant_domain": "example.com",
"client_id": "some_client_id",
"client_secret": "some_client_secret",
"api_enable_groups": true,
"api_enable_users": true
},
"directory_provisioning_configuration": {
"mapping": [
{ "auth0": "email", "idp": "mail" },
{ "auth0": "name", "idp": "displayName" }
],
"synchronize_automatically": false,
"synchronize_groups": "selected",
"synchronized_groups": [
{
"id": "group-id-1",
"name": "Engineering",
"email": "engineering@example.com",
"direct_members_count": 42
},
{
"id": "group-id-2",
"name": "Design",
"email": "design@example.com",
"direct_members_count": 10
}
]
}
}For enterprise connections with strategy oidc or okta, the Deploy CLI supports these optional fields under connections[].options:
token_endpoint_auth_signing_alg(string): Allowed values areRS256,RS384,RS512,PS256,PS384,ES256,ES384.id_token_signed_response_algs(string[]): Allow-list for incoming ID token signing algorithms. Allowed values areRS256,RS384,RS512,PS256,PS384,ES256,ES384.token_endpoint_jwtca_aud_format(string): Allowed values areissuerortoken_endpoint.
YAML Example
connections:
- name: enterprise-oidc
strategy: oidc
enabled_clients:
- My SPA
options:
type: back_channel
issuer: https://example-idp.com
jwks_uri: https://example-idp.com/.well-known/jwks.json
token_endpoint_auth_signing_alg: RS384
id_token_signed_response_algs:
- RS256
- RS384
token_endpoint_jwtca_aud_format: token_endpointDirectory Example
./connections/enterprise-oidc.json
{
"name": "enterprise-oidc",
"strategy": "oidc",
"enabled_clients": ["My SPA"],
"options": {
"type": "back_channel",
"issuer": "https://example-idp.com",
"jwks_uri": "https://example-idp.com/.well-known/jwks.json",
"token_endpoint_auth_signing_alg": "RS384",
"id_token_signed_response_algs": ["RS256", "RS384"],
"token_endpoint_jwtca_aud_format": "token_endpoint"
}
}Early Access: Requires the
token_vault_xaafeature flag to be enabled on the tenant.
For enterprise connections with strategy oidc or okta, the Deploy CLI supports configuring the connection as a Requesting Application for Cross App Access via the top-level cross_app_access_requesting_app field:
cross_app_access_requesting_app.active(boolean): Set totrueto enable the connection as a Requesting Application for Cross App Access. Defaults totrue.
YAML Example
connections:
- name: enterprise-oidc
strategy: oidc
cross_app_access_requesting_app:
active: true
options:
type: back_channel
issuer: https://example-idp.com
jwks_uri: https://example-idp.com/.well-known/jwks.jsonDirectory Example
./connections/enterprise-oidc.json
{
"name": "enterprise-oidc",
"strategy": "oidc",
"cross_app_access_requesting_app": {
"active": true
},
"options": {
"type": "back_channel",
"issuer": "https://example-idp.com",
"jwks_uri": "https://example-idp.com/.well-known/jwks.json"
}
}Early Access: Part of the XAA (Cross App Access) — Auth0 as Resource Application Authorization Server feature.
The Deploy CLI supports configuring a connection as a Resource Application for Cross App Access via the top-level cross_app_access_resource_app field. This is supported for enterprise connections including SAML (strategy: samlp) and OIDC (strategy: oidc).
cross_app_access_resource_app.status("enabled"|"disabled"): Enables or disables the connection as a Resource Application for Cross App Access.
For SAML connections, the discovery_url and oidc_metadata connection options — previously only supported for OIDC connections — are now also accepted under options.
YAML Example
connections:
- name: enterprise-saml
strategy: samlp
cross_app_access_resource_app:
status: enabled
options:
discovery_url: https://example-idp.com/.well-known/openid-configuration
oidc_metadata:
issuer: https://example-idp.comDirectory Example
./connections/enterprise-saml.json
{
"name": "enterprise-saml",
"strategy": "samlp",
"cross_app_access_resource_app": {
"status": "enabled"
},
"options": {
"discovery_url": "https://example-idp.com/.well-known/openid-configuration",
"oidc_metadata": {
"issuer": "https://example-idp.com"
}
}
}Early Access: Part of the XAA (Cross App Access) — Auth0 as Resource Application Authorization Server feature.
The Deploy CLI supports the identity_assertion_authorization_grant property on clients, which enables the client to participate in Cross App Access (ID-JAG) token exchange.
identity_assertion_authorization_grant.active(boolean): Set totrueto enable ID-JAG exchange for the client.
clients:
- name: My XAA Client
identity_assertion_authorization_grant:
active: trueThe Deploy CLI supports the anonymous_sessions property on clients, which controls whether the client can start anonymous sessions.
anonymous_sessions.active(boolean): Set totrueto enable anonymous sessions for the client.
YAML Example
clients:
- name: My Application
anonymous_sessions:
active: trueDirectory Example
{
"name": "My Application",
"anonymous_sessions": {
"active": true
}
}When managing database connections, the values of options.customScripts point to specific javascript files relative to
the path of the output folder. Otherwise, the payload closely matches that of the Management API.
YAML Example
Folder structure when in YAML mode.
./databases/
/Username-Password-Authentication
/change_password.js
/create.js
/delete.js
/get_user.js
/login.js
/verify.js
./tenant.yaml
# Contents of ./tenant.yaml
databases:
- name: Username-Password-Authentication
# ...
options:
# ...
customScripts:
change_password: ./databases/Username-Password-Authentication/change_password.js
create: ./databases/Username-Password-Authentication/create.js
delete: ./databases/Username-Password-Authentication/delete.js
get_user: ./databases/Username-Password-Authentication/get_user.js
login: ./databases/Username-Password-Authentication/login.js
verify: ./databases/Username-Password-Authentication/verify.jsDirectory Example
Folder structure when in directory mode.
./database-connections/
./Username-Password-Authentication/
./change_password.js
./create.js
./database.json
./delete.js
./get_user.js
./login.js
./verify.js
Contents of database.json
{
"options": {
"customScripts": {
"change_password": "./change_password.js",
"create": "./create.js",
"delete": "./delete.js",
"get_user": "./get_user.js",
"login": "./login.js",
"verify": "./verify.js"
}
}
}Resource servers (APIs) configuration supports the Management API payload schema. The following fields are supported:
YAML Example
resourceServers:
- name: My API
identifier: https://api.example.com
proof_of_possession:
mechanism: dpop
required: true
required_for: public_clientsDirectory Example
{
"name": "My API",
"identifier": "https://api.example.com",
"proof_of_possession": {
"mechanism": "mtls",
"required": true,
"required_for": "all_clients"
}
}The authorization_policy field can be set on the Auth0 My Account API resource server (the system resource server with identifier https://<tenant-domain>/me/) when the acr feature flag is enabled on the tenant. It specifies an Authentication Context Class Reference (ACR) policy that controls the authentication assurance requirements for access tokens issued to that API.
YAML Example
resourceServers:
- name: Auth0 My Account API
identifier: https://your-tenant.auth0.com/me/
authorization_policy:
policy_id: '019b76da-a800-73c9-b656-b349ae415c17'To clear the policy, set it to null:
resourceServers:
- name: Auth0 My Account API
identifier: https://your-tenant.auth0.com/me/
authorization_policy: nullDirectory Example
{
"name": "Auth0 My Account API",
"identifier": "https://your-tenant.auth0.com/me/",
"authorization_policy": {
"policy_id": "019b76da-a800-73c9-b656-b349ae415c17"
}
}Note:
authorization_policyis only accepted by the Auth0 API for the My Account resource server and only when theacrfeature flag is enabled on the tenant.
The allow_online_access field enables issuance of Online Refresh Tokens (ORTs) for a resource server. ORTs are stateless, non-rotating tokens bound to the Auth0 session lifetime — when the session expires or is revoked, the ORT becomes invalid.
allow_online_access_with_ephemeral_sessions permits ORT issuance even when the session uses a non-persistent (ephemeral) cookie. This field can only be set to true if allow_online_access is also true.
Both fields default to false and require the online_refresh_tokens feature flag to be enabled on the tenant.
YAML Example
resourceServers:
- name: My API
identifier: https://api.example.com
allow_online_access: true
allow_online_access_with_ephemeral_sessions: falseDirectory Example
{
"name": "My API",
"identifier": "https://api.example.com",
"allow_online_access": true,
"allow_online_access_with_ephemeral_sessions": false
}Anonymous Sessions: subject_type_authorization.anonymous_user, token_lifetime_for_anonymous_access_tokens, and access_token.claims_mapping
The Deploy CLI supports the resource server fields that configure anonymous-session access tokens:
subject_type_authorization.anonymous_user.policy(string): The access policy for anonymous user flows. One ofdeny_allorrequire_client_grant. This sits alongside the existinguserandclientpolicies. Note thatsubject_type_authorizationdoes not allow unknown properties, soanonymous_usermust be spelled exactly as shown.token_lifetime_for_anonymous_access_tokens(number): Expiration value, in seconds, for anonymous-session access tokens issued for this API.access_token.claims_mapping.custom_claims(array): Custom claims to emit in anonymous-session access tokens. Each rule maps a value read from the anonymous-session context onto a named access-token claim, and has two fields:name(string): The access-token claim name to emit.expression(string): A restricted dot-path expression read from the anonymous-session context (for exampleanonymous_session.metadata.country).
When the anonymous policy is require_client_grant, a client must hold a client grant with subject_type: anonymous_user for this audience (see the Client Grants section above).
YAML Example
resourceServers:
- name: My API
identifier: https://api.example.com
subject_type_authorization:
user:
policy: allow_all
client:
policy: require_client_grant
anonymous_user:
policy: require_client_grant
token_lifetime_for_anonymous_access_tokens: 3600
access_token:
claims_mapping:
custom_claims:
- name: country
expression: anonymous_session.metadata.countryDirectory Example
{
"name": "My API",
"identifier": "https://api.example.com",
"subject_type_authorization": {
"user": { "policy": "allow_all" },
"client": { "policy": "require_client_grant" },
"anonymous_user": { "policy": "require_client_grant" }
},
"token_lifetime_for_anonymous_access_tokens": 3600,
"access_token": {
"claims_mapping": {
"custom_claims": [{ "name": "country", "expression": "anonymous_session.metadata.country" }]
}
}
}When overriding the Universal Login with custom HTML, the error, login, multi-factor authentication and password reset contents are organized in specific HTML pages.
YAML Example
Folder structure when in YAML mode.
./pages/
/error_page.html
/guardian_multifactor.html
/login.html
/password_reset.html
./tenant.yaml
# Contents of ./tenant.yaml
pages:
- name: error_page
html: ./pages/error_page.html
show_log_link: false
url: https://mycompany.org/error
- name: guardian_multifactor
enabled: true
html: ./pages/guardian_multifactor.html
- name: login
enabled: false
html: ./pages/login.html
- name: password_reset
enabled: true
html: ./pages/password_reset.htmlDirectory Example
Folder structure when in directory mode.
./pages/
./error_page.html
./error_page.json
./guardian_multifactor.html
./guardian_multifactor.json
./login.html
./login.json
./password_reset.html
./password_reset.json
Contents of login.json
{
"name": "login",
"enabled": false,
"html": "./login.html"
}Contents of error_page.json
{
"html": "./error_page.html",
"show_log_link": false,
"url": "https://mycompany.org/error",
"name": "error_page"
}Contents of guardian_multifactor.json
{
"enabled": true,
"html": "./guardian_multifactor.html",
"name": "guardian_multifactor"
}Contents of password_reset.json
{
"enabled": true,
"html": "./password_reset.html",
"name": "password_reset"
}When managing email templates, the values of options.body and options.body point to specific HTML files relative to the path of the output folder. Otherwise, the payload closely matches that of the Management API.
YAML Example
Folder structure when in YAML mode.
./emailTemplates/
./verify_email.html
./welcome_email.html
./password_reset.html
./reset_email.html
./reset_email_by_code.html
./tenant.yaml
# Contents of ./tenant.yaml
emailTemplates:
- template: 'verify_email'
enabled: true
syntax: 'liquid'
from: 'test@email.com'
subject: 'something'
body: 'emailTemplates/change_email.html'
- template: 'welcome_email'
enabled: true
syntax: 'liquid'
from: 'test@email.com'
subject: 'something'
body: 'emailTemplates/change_email.html'
- template: 'password_reset'
enabled: true
syntax: 'liquid'
from: 'test@email.com'
subject: 'something'
body: 'emailTemplates/change_email.html'
- template: 'reset_email_by_code'
enabled: true
syntax: 'liquid'
from: 'test@email.com'
subject: 'something'
body: 'emailTemplates/change_email.html'Directory Example
Folder structure when in directory mode.
./emailTemplates/
./welcome_email.html
./welcome_email.json
./reset_email.html
./reset_email.json
./reset_email_by_code.html
./reset_email_by_code.json
Contents of welcome_email.json
{
"name": "welcome_email",
"enabled": true,
"html": "./welcome_email.html"
}Contents of reset_email.json
{
"name": "reset_email",
"enabled": true,
"html": "./reset_email.html"
}Contents of reset_email_by_code.json
{
"name": "reset_email_by_code",
"enabled": true,
"html": "./reset_email_by_code.html"
}This resource allows to manage branding within your Auth0 tenant. Auth0 can be customized with a look and feel that aligns with your organization's brand requirements and user expectations. universal_login template can be customized (make sure to add read:custom_domains scope to export templates).
YAML Example
Folder structure when in YAML mode.
branding:
colors:
page_background: '#FF4F40'
primary: '#2A2E35'
favicon_url: https://example.com/favicon.png
font:
url: https://example.com/font.woff
logo_url: https://example.com/logo.png
templates:
- template: universal_login
body: ./branding_templates/universal_login.htmlDirectory Example
Folder structure when in directory mode.
{
"colors": {
"page_background": "#FF4F40",
"primary": "#2A2E35"
},
"favicon_url": "https://example.com/favicon.png",
"font": {
"url": "https://example.com/font.woff"
},
"logo_url": "https://example.com/logo.png"
}For universal_login template templates/ will be created.
templates/universal_login.html
<!DOCTYPE html>
<html>
<head>
{%- auth0:head -%}
</head>
<body>
{%- auth0:widget -%}
<div>page teamplate</div>
</body>
</html>templates/universal_login.json
{
"template": "universal_login",
"body": "./universal_login.html"
}Early Access: Requires the
universal_login_theme_identifiersfeature flag to be enabled on the tenant. When the flag is off, the Auth0 API rejects a theme write that includesidentifiersand strips the field from responses.
The Deploy CLI supports configuring identifier display settings on the branding theme via the top-level identifiers object. All three members are required when identifiers is supplied:
identifiers.login_display(string): Login display mode. One ofseparate,unified.identifiers.otp_autocomplete(boolean): Whether OTP autocomplete is enabled.identifiers.phone_display(object): Phone number display settings.identifiers.phone_display.formatting(string): One ofinternational,regional.identifiers.phone_display.masking(string): One ofhide_country_code,mask_digits,show_all.
YAML Example
themes:
- displayName: Default theme
borders: { ... }
colors: { ... }
fonts: { ... }
page_background: { ... }
widget: { ... }
identifiers:
login_display: unified
otp_autocomplete: true
phone_display:
masking: mask_digits
formatting: internationalDirectory Example
./themes/Default theme.json
{
"displayName": "Default theme",
"borders": { "...": "..." },
"colors": { "...": "..." },
"fonts": { "...": "..." },
"page_background": { "...": "..." },
"widget": { "...": "..." },
"identifiers": {
"login_display": "unified",
"otp_autocomplete": true,
"phone_display": {
"masking": "mask_digits",
"formatting": "international"
}
}
}Early Access: Requires the
tenant_country_codes_filteringfeature flag to be enabled on the tenant. When the flag is off, the Auth0 API rejects a tenant settings write that includescountry_codes.
The Deploy CLI supports configuring phone country code filtering for identifier input via the top-level country_codes object in tenant settings:
country_codes.list(array of string): ISO 3166-1 alpha-2 codes (e.g.US,GB). Must be non-empty and unique.country_codes.mode(string): Whether the list is an allowlist or denylist. One ofallow,deny.
Set country_codes: null to remove filtering (allow all countries).
YAML Example
tenant:
country_codes:
list:
- US
- GB
- CA
mode: allowDirectory Example
./tenant.json
{
"country_codes": {
"list": ["US", "GB", "CA"],
"mode": "allow"
}
}The Deploy CLI supports configuring anonymous session behavior via the top-level sessions.anonymous object in tenant settings:
sessions.anonymous.lifetime_in_minutes(integer): The lifetime of an anonymous session, in minutes.sessions.anonymous.activate_cookie(boolean): Whether to activate the anonymous session cookie.
Other keys under sessions are passed through untouched, so unmanaged session settings are preserved.
YAML Example
tenant:
sessions:
anonymous:
lifetime_in_minutes: 120
activate_cookie: trueDirectory Example
./tenant.json
{
"sessions": {
"anonymous": {
"lifetime_in_minutes": 120,
"activate_cookie": true
}
}
}Custom domains allow you to use your own domain for authentication instead of the default Auth0 domain. The Deploy CLI supports managing custom domains in both directory and YAML modes.
Custom domains have the following key properties:
domain: The custom domain name (required)type: Certificate management type - eitherauth0_managed_certsorself_managed_certs(required)custom_client_ip_header: Header to use for client IP detection (optional, one of:true-client-ip,cf-connecting-ip,x-forwarded-for, ornull)tls_policy: TLS policy to use (defaults torecommended)verification_method: Domain verification method (defaults totxt)domain_metadata: Metadata associated with the custom domain (optional, max 10 properties)relying_party_identifier: Relying Party ID (rpId) to be used for Passkeys on this custom domain. If not provided or set to null, the full domain will be used. (optional)
Note: The relying_party_identifier should be a suffix of the domain name. For example, if your domain is auth.example.com, the relying_party_identifier could be example.com.
YAML Example
# Contents of ./tenant.yaml
customDomains:
- domain: 'auth.example.com'
type: 'auth0_managed_certs'
tls_policy: 'recommended'
custom_client_ip_header: 'cf-connecting-ip'
domain_metadata:
environment: 'production'
team: 'platform'
relying_party_identifier: 'example.com'
- domain: 'login.myapp.com'
type: 'self_managed_certs'
verification_method: 'txt'Directory Example
Folder structure when in directory mode.
./customDomains/
./auth.example.com.json
./login.myapp.com.json
Contents of auth.example.com.json:
{
"domain": "auth.example.com",
"type": "auth0_managed_certs",
"tls_policy": "recommended",
"custom_client_ip_header": "cf-connecting-ip",
"domain_metadata": {
"environment": "production",
"team": "platform"
},
"relying_party_identifier": "example.com"
}Contents of login.myapp.com.json:
{
"domain": "login.myapp.com",
"type": "self_managed_certs",
"verification_method": "txt"
}For more details, see the Management API documentation.
Tenant Network Access Control Lists (NetworkACLs) allow you to configure rules that control access to your Auth0 tenant based on IP addresses, geographical locations, and other network criteria. The Deploy CLI supports managing NetworkACLs in both directory and YAML modes.Refer more on this.
NetworkACLs have the following key properties:
description: A descriptive name for the ruleactive: Boolean indicating if the rule is activepriority: Number (minimum 1) determining the order of rule evaluation (lower numbers have higher priority)rule: The rule configuration containing:action: The action to take (block, allow, log, or redirect)scope: The scope of the rule ('management', 'authentication', or 'tenant')match,not_match, ormatch_all: Criteria for matching requests
The match and not_match criteria also support an auth0_managed array for matching Auth0-managed IP ranges (e.g. auth0.icloud_relay_proxy, auth0.low_reputation). Each value must follow the pattern ^auth0\.[^.\s]+$. This is an Early Access feature gated behind the tenant_acl_curated_blocklists feature flag and requires the advanced-breached-password-detection entitlement; the API rejects rules using auth0_managed with an HTTP 403 if the tenant is not entitled.
Set match_all: true for a rule that unconditionally matches all traffic (e.g. block or allow everything within a scope), with no other signal required. match_all is mutually exclusive with match and not_match — a rule may use only one of the three, and combining them is rejected. Only true is valid; omit the property rather than setting it to false. match_all is gated behind the tenant_acl_match_all feature flag, and the API rejects rules using it with an HTTP 400 if the tenant does not have the flag enabled.
YAML Example
# Contents of ./tenant.yaml
networkACLs:
- description: 'Allow Specific Countries'
active: true
priority: 2
rule:
action:
allow: true
scope: 'authentication'
match:
geo_country_codes: ['US', 'CA']
- description: 'Redirect Specific User Agents'
active: true
priority: 3
rule:
action:
block: true
scope: 'management'
not_match:
user_agents: ['BadBot/1.0']
- description: 'Block iCloud Private Relay Exits'
active: true
priority: 4
rule:
action:
block: true
scope: 'tenant'
match:
auth0_managed: ['auth0.icloud_relay_proxy']
- description: 'Block All Tenant Traffic'
active: true
priority: 99
rule:
action:
block: true
scope: 'tenant'
match_all: trueDirectory Example
Folder structure when in directory mode.
./networkACLs/
./Allow Specific Countries-p-2.json
./Redirect Specific User Agents-p-3.json
./Block iCloud Private Relay Exits-p-4.json
./Block All Tenant Traffic-p-99.json
Contents of Allow Specific Countries-p-2.json:
{
"description": "Allow Specific Countries",
"active": true,
"priority": 2,
"rule": {
"action": {
"allow": true
},
"scope": "authentication",
"match": {
"geo_country_codes": ["US", "CA"]
}
}
}Contents of Redirect Specific User Agents-p-3.json:
{
"description": "Redirect Specific User Agents",
"active": true,
"priority": 3,
"rule": {
"action": {
"block": true
},
"scope": "management",
"match": {
"user_agents": ["BadBot/1.0"]
}
}
}Contents of Block iCloud Private Relay Exits-p-4.json:
{
"description": "Block iCloud Private Relay Exits",
"active": true,
"priority": 4,
"rule": {
"action": {
"block": true
},
"scope": "tenant",
"match": {
"auth0_managed": ["auth0.icloud_relay_proxy"]
}
}
}Contents of Block All Tenant Traffic-p-99.json:
{
"description": "Block All Tenant Traffic",
"active": true,
"priority": 99,
"rule": {
"action": {
"block": true
},
"scope": "tenant",
"match_all": true
}
}Network ACL Keys are HMAC signing keys used for HTTP message signature verification in Network ACL rules. Each key has a name, an algorithm (hmac-sha256), and a server-computed fingerprint. The Deploy CLI supports creating and deleting NetworkACL keys.
Note: This feature requires the
tenant_acl_hmac_signatureandtenant_acl_management_apifeature flags plus thetenant-access-controlentitlement. Contact Auth0 support if the feature is not available on your tenant.
NetworkACL keys have the following properties:
name: Unique name for the key (max 255 characters)alg: Signing algorithm — currently onlyhmac-sha256value: The raw key material (write-only — never returned by the API, not exported). Supply via keyword replacement (e.g.##HMAC_KEY_VALUE##) mapped from an environment variable or CI secret.fingerprint: SHA-256 fingerprint of the key (read-only, set by the API, exported for reference)
Keys are immutable after creation. To rotate a key, delete the old one and create a new one with a different name.
Warning: Deleting a key that is still referenced by an ACL rule will return HTTP 409. Remove all rule references first.
The value field is write-only and is never returned by the API. At deploy time, supply it using keyword replacement:
# config.json (or environment variables)
# HMAC_KEY_VALUE=<your-secret-key-material>
# tenant.yaml
networkACLKeys:
- name: my-hmac-key-v1
alg: hmac-sha256
value: ##HMAC_KEY_VALUE##If value is omitted from the config, the Deploy CLI will log a warning and skip creating that key. This is useful for tracking existing keys (by name and fingerprint) without re-supplying the secret.
YAML Example
# Contents of ./tenant.yaml
networkACLKeys:
- name: my-hmac-key-v1
alg: hmac-sha256
value: ##HMAC_KEY_VALUE## # omitted on export; supply at deploy time
fingerprint: ee66b47a0b3e356a0d7c587bd1e2ed3790b46fdbd657dbeb409f30de76a14cc3Directory Example
Folder structure when in directory mode.
./network-acl-keys/
./my-hmac-key-v1.json
Contents of my-hmac-key-v1.json:
{
"name": "my-hmac-key-v1",
"alg": "hmac-sha256",
"fingerprint": "ee66b47a0b3e356a0d7c587bd1e2ed3790b46fdbd657dbeb409f30de76a14cc3"
}Once a key is deployed, reference it by id in an ACL rule's http_message_signature signal:
networkACLs:
- description: 'Require HMAC signature'
active: true
priority: 1
rule:
action:
allow: true
scope: 'authentication'
match:
http_message_signature:
keys:
- id: <key-id> # the id returned by the API after key creationThe deploy CLI supports managing organizations, including their connections, client grants, discovery domains, and org-to-app entitlement settings.
Note: Requires the
org_to_app_entitlement_enabledfeature flag to be enabled on the tenant.
is_app_entitlement_active controls whether org-to-app entitlement is active for an organization. When active, the clients array specifies which client applications org members are entitled to use for login.
Each entry in clients has:
client_id— the name of the client application (resolved to the actual ID at deploy time)use_for_member_access— whentrue, org members can use this client to log in
YAML Example
organizations:
- name: my-organization
display_name: My Organization
is_app_entitlement_active: true
clients:
- client_id: My App
use_for_member_access: trueDirectory Example
./organizations/my-organization.json
{
"name": "my-organization",
"display_name": "My Organization",
"is_app_entitlement_active": true,
"clients": [
{
"client_id": "My App",
"use_for_member_access": true
}
]
}Note: When exporting,
client_idvalues are resolved to client names for portability across environments. On deploy, names are resolved back to IDs. The M2M application used by the deploy CLI requires theread:organization_clients,create:organization_clients,update:organization_clients, anddelete:organization_clientsscopes.
When managing phone providers, credentials are never exported.
For the Twilio phoneProvider, we add the placeholder ##TWILIO_AUTH_TOKEN## for the credential's auth_token, which can be used with keyword replacement.
Refer to keyword-replacement.md, multi-environment-workflow.md, and the Management API for more details.
YAML Example
# Contents of ./tenant.yaml
phoneProviders:
- name: twilio
configuration:
sid: 'twilio_sid'
default_from: '+1234567890'
delivery_methods:
- text
- voice
disabled: false
credentials:
auth_token: '##TWILIO_AUTH_TOKEN##'Directory Example
[
{
"name": "twilio",
"disabled": true,
"configuration": {
"sid": "twilio_sid",
"default_from": "+1234567890",
"delivery_methods": ["text", "voice"]
},
"credentials": {
"auth_token": "##TWILIO_AUTH_TOKEN##"
}
}
]Phone templates allow you to customize the SMS and voice messages sent to users for phone-based authentication. Refer to the Management API for more details.
# Contents of ./tenant.yaml
phoneTemplates:
- type: otp_verify
disabled: false
content:
from: '+12341234567'
body:
text: 'Your verification code is {{ code }}'
voice: 'Your verification code is {{ code }}'
- type: otp_enroll
disabled: false
content:
from: '+12341234567'
body:
text: 'Your enrollment code is {{ code }}'Create individual JSON files for each template in the phone-templates directory:
phone-templates/
├── otp_verify.json
├── otp_enroll.json
├── change_password.json
└── ...
Example phone-templates/otp_verify.json:
{
"type": "otp_verify",
"disabled": false,
"content": {
"from": "+12341234567",
"body": {
"text": "Your verification code is {{ code }}",
"voice": "Your verification code is {{ code }}"
}
}
}Application specific configuration for use with the OIN Express Configuration feature
The cross_app_access_resource_app field controls whether organization admins may enable Cross App Access (XAA) on their Identity Providers:
cross_app_access_resource_app.status.default_value("enabled"|"disabled"): The default Cross App Access resource app status.cross_app_access_resource_app.status.allowed_values(array of"enabled"|"disabled"): The allowed status values.
# Contents of ./tenant.yaml
connectionProfiles:
- name: 'Enterprise SSO Profile'
organization:
show_as_button: 'required'
assign_membership_on_login: 'required'
connection_name_prefix_template: 'org-{organization_name}'
enabled_features:
- scim
- universal_logout
cross_app_access_resource_app:
status:
default_value: 'enabled'
allowed_values:
- enabled
- disabled
strategy_overrides:
samlp:
enabled_features:
- universal_logout
oidc:
enabled_features:
- scim
- universal_logout
- name: 'Basic Connection Profile'
organization:
show_as_button: 'optional'
assign_membership_on_login: 'optional'
enabled_features:
- scimFile: ./connection-profiles/Enterprise SSO Profile.json
{
"name": "Enterprise SSO Profile",
"organization": {
"show_as_button": "required",
"assign_membership_on_login": "required"
},
"connection_name_prefix_template": "org-{organization_name}",
"enabled_features": ["scim", "universal_logout"],
"cross_app_access_resource_app": {
"status": {
"default_value": "enabled",
"allowed_values": ["enabled", "disabled"]
}
},
"strategy_overrides": {
"samlp": {
"enabled_features": ["universal_logout"]
},
"oidc": {
"enabled_features": ["scim", "universal_logout"]
}
}
}Early Access — requires the
enterprise_connect_entitledentitlement on your tenant.
The b2b_integration_configuration object enables Enterprise Connect functionality on a client. It can be set at creation time regardless of app_type. Once set, it can be updated via deploy as normal.
Important:
b2b_integration_configurationcannot be added to an existing client via PATCH. If you need to add it to a client that was created without it, re-create the client. The deploy-cli will warn and skip the field if this constraint is violated.
The integration_type field accepts one of: custom_auth_server, third_party, application.
clients:
- name: 'My B2B Integration Client'
app_type: 'spa'
b2b_integration_configuration:
integration_type: 'custom_auth_server'To clear b2b_integration_configuration, set it to null:
clients:
- name: 'My B2B Integration Client'
app_type: 'spa'
b2b_integration_configuration: nullEarly Access — requires the
my_org_member_management_eafeature flag on your tenant.
Two boolean fields control member management behaviour for the My Organization API. Both are nested under my_organization_configuration on the client object.
| Field | Type | Default | Description |
|---|---|---|---|
enforce_permission_ceiling |
boolean | false |
When true, limits the permissions that organization admins can assign to members to only those held by the admin themselves. |
enforce_self_assignment_restriction |
boolean | false |
When true, prevents organization admins from assigning permissions to themselves. |
FF gating behaviour: When the feature flag is off, the API strips both fields from GET responses (export produces no fields) and returns 403 UNSUPPORTED_OPERATION if either field is included in a PATCH/POST payload — even when set to false. The deploy-cli surfaces this error to the user.
Export behaviour for false values: The API omits these fields from GET responses when their value is false. As a result, exported YAML will only contain enforce_permission_ceiling or enforce_self_assignment_restriction when they are true. This is expected — a missing field in the export means the value is false.
Omitting a field resets it to false: If you include my_organization_configuration in your config but omit one of the enforce fields, the API treats the omitted field as false on the next deploy. To preserve an existing true value you must explicitly include the field.
clients:
- name: 'My Organization App'
app_type: 'regular_web'
my_organization_configuration:
allowed_strategies:
- oidc
connection_deletion_behavior: allow
enforce_permission_ceiling: true
enforce_self_assignment_restriction: trueTo disable the restrictions, either omit the fields or set them explicitly to false:
clients:
- name: 'My Organization App'
app_type: 'regular_web'
my_organization_configuration:
allowed_strategies:
- oidc
connection_deletion_behavior: allow
enforce_permission_ceiling: false
enforce_self_assignment_restriction: falseConnection profiles are used in conjunction with the express_configuration property on client applications: (In order to use express_configuration app_type should not be 'express_configuration')
clients:
- name: 'My Enterprise App'
app_type: 'regular_web'
express_configuration:
initiate_login_uri_template: 'https://myapp.com/sso/start?org={organization_name}&conn={connection_name}'
user_attribute_profile_id: 'My User Attribute Profile'
connection_profile_id: 'Enterprise SSO Profile' # Reference to connection profile
enable_client: true
enable_organization: true
okta_oin_client_id: 'My Okta OIN Client'
admin_login_domain: 'login.myapp.com'
linked_clients:
- client_id: 'client_id_of_mobile_app'For more details, see the Management API documentation.
Self-Service Profiles enable organizations to configure self-service SSO flows for their users. These profiles define the user attributes to collect, branding customization, and which identity provider strategies are allowed during the self-service setup process.
Note: You cannot specify both user_attribute_profile_id and user_attributes in the same profile. Use user_attribute_profile_id to reference an existing User Attribute Profile, or define user_attributes inline.
# Contents of ./tenant.yaml
selfServiceProfiles:
- name: 'Enterprise SSO Profile'
description: 'Self-service SSO for enterprise customers'
allowed_strategies:
- oidc
- samlp
- okta
user_attributes:
- name: email
description: Email of the User
is_optional: false
- name: name
description: Name of the User
is_optional: true
branding:
logo_url: 'https://example.com/logo.png'
colors:
primary: '#19aecc'
customText:
en:
get-started:
introduction: 'Welcome! With <p>only a few steps</p> you will be able to setup your new connection.'
- name: 'Simple SSO Profile'
description: 'Basic SSO profile'
user_attribute_profile_id: 'My User Attribute Profile'
allowed_strategies:
- google-apps
- adfsFolder structure when in directory mode.
./self-service-profiles/
./Enterprise SSO Profile.json
./Simple SSO Profile.json
Contents of Enterprise SSO Profile.json:
{
"name": "Enterprise SSO Profile",
"description": "Self-service SSO for enterprise customers",
"allowed_strategies": ["oidc", "samlp", "okta"],
"user_attributes": [
{
"name": "email",
"description": "Email of the User",
"is_optional": false
},
{
"name": "name",
"description": "Name of the User",
"is_optional": true
}
],
"branding": {
"logo_url": "https://example.com/logo.png",
"colors": {
"primary": "#19aecc"
}
},
"customText": {
"en": {
"get-started": {
"introduction": "Welcome! With <p>only a few steps</p> you will be able to setup your new connection."
}
}
}
}Contents of Simple SSO Profile.json:
{
"name": "Simple SSO Profile",
"description": "Basic SSO profile",
"user_attribute_profile_id": "My User Attribute Profile",
"allowed_strategies": ["google-apps", "adfs"]
}For more details, see the Management API documentation.
Risk assessments configuration allows you to enable or disable risk assessment features for your tenant.
Entitlement required: Risk assessments are part of Adaptive MFA, which requires an Enterprise add-on. On tenants without this entitlement, export and deploy of
riskAssessmentwill be skipped with a warning.
settings.enabled: toggles the feature true/flase (required)new_device.remember_for(optional): days to remember devices
# Contents of ./tenant.yaml
riskAssessment:
settings:
enabled: true
new_device:
remember_for: 30Folder: ./risk-assessment/
File: ./risk-assessment/settings.json
{
"settings": {
"enabled": true
},
"new_device": {
"remember_for": 30
}
}For more details, see the Management API documentation.
Action modules are reusable code modules that can be shared across multiple Auth0 actions. They allow you to create common utility functions, helpers, and libraries that can be imported and used by any action in your tenant.
# Contents of ./tenant.yaml
actionModules:
- name: auth-helper
code: ./action-modules/auth-helper/code.js
dependencies:
- name: axios
version: 1.6.0
- name: jsonwebtoken
version: 9.0.0
secrets:
- name: JWT_SECRET
value: ##JWT_SECRET##
- name: notification-helper
code: ./action-modules/notification-helper/code.js
dependencies:
- name: uuid
version: 9.0.0
secrets: []Folder structure when in YAML mode:
./action-modules/
/auth-helper/
/code.js
/notification-helper/
/code.js
./tenant.yaml
Folder structure when in directory mode:
./action-modules/
./auth-helper.json
./auth-helper/
./code.js
./notification-helper.json
./notification-helper/
./code.js
Contents of auth-helper.json:
{
"name": "auth-helper",
"code": "./action-modules/auth-helper/code.js",
"dependencies": [
{
"name": "axios",
"version": "1.6.0"
},
{
"name": "jsonwebtoken",
"version": "9.0.0"
}
],
"secrets": [
{
"name": "JWT_SECRET",
"value": "##JWT_SECRET##"
}
]
}Contents of auth-helper/code.js:
const jwt = require('jsonwebtoken');
const axios = require('axios');
/**
* Auth Helper Module
* Provides JWT validation and token refresh utilities
*/
module.exports = {
async validateToken(token) {
const secret = actions.secrets.JWT_SECRET;
try {
return jwt.verify(token, secret);
} catch (error) {
throw new Error('Invalid token: ' + error.message);
}
},
async fetchUserData(userId) {
const response = await axios.get(`https://api.example.com/users/${userId}`);
return response.data;
},
};Actions can reference action modules in their configuration:
YAML Example:
actions:
- name: send-phone-message
code: ./actions/send-phone-message/code.js
supported_triggers:
- id: send-phone-message
version: v1
modules:
- module_name: notification-helper
module_version_number: 1Directory Example:
Contents of actions/send-phone-message.json:
{
"name": "send-phone-message",
"code": "./actions/send-phone-message/code.js",
"supported_triggers": [
{
"id": "send-phone-message",
"version": "v1"
}
],
"modules": [
{
"module_name": "notification-helper",
"module_version_number": 1
}
]
}The action can then import and use the module in its code:
const notificationHelper = require('actions:notification-helper');
exports.onExecuteSendPhoneMessage = async (event) => {
const message = notificationHelper.formatMessage(
event.user.phone_number,
'Your verification code'
);
};Supplemental signals configuration allows you to enable third-party integrations for enhanced security and risk assessment.
akamai_enabled(boolean): Enable processing of incoming Akamai headers for supplemental security signals
# Contents of ./tenant.yaml
supplementalSignals:
akamai_enabled: trueFolder: ./supplemental-signals.json
{
"akamai_enabled": true
}For more details, see the Management API documentation.
Event Streams allow you to subscribe to Auth0 tenant events and forward them to external destinations (webhook, AWS EventBridge, or an Auth0 Action).
name(string, required): Display name for the event stream.status(string):enabledordisabled.subscriptions(array): List of event types to subscribe to. Each entry has anevent_typestring (e.g.user.created,organization.member.added). If omitted, no events are forwarded.destination(object, required): Destination configuration.type(string):webhook,eventbridge, oraction.configuration(object): Destination-specific settings.
{
"type": "webhook",
"configuration": {
"webhook_endpoint": "https://example.com/events",
"webhook_authorization": {
"method": "bearer"
}
}
}Supported webhook_authorization methods: basic (username only returned), bearer, custom_header. Secrets are masked on export unless AUTH0_EXPORT_SECRETS: true.
{
"type": "eventbridge",
"configuration": {
"aws_account_id": "123456789012",
"aws_region": "us-east-1"
}
}Note: EventBridge streams cannot have their destination updated after creation. Only name, subscriptions, and status can be patched.
{
"type": "action",
"configuration": {
"action_id": "act_abc123"
}
}Note: like EventBridge, Action streams cannot have their destination updated after creation. Only name, subscriptions, and status can be patched — the destination is stripped from update payloads (an info message is logged when this happens).
# Contents of ./tenant.yaml
eventStreams:
- name: My Webhook Stream
status: enabled
subscriptions:
- event_type: user.created
- event_type: user.deleted
destination:
type: webhook
configuration:
webhook_endpoint: https://example.com/events
webhook_authorization:
method: bearerFolder: ./event-streams/
Each event stream is stored as a separate JSON file named after the stream (e.g. my-webhook-stream.json):
{
"name": "My Webhook Stream",
"status": "enabled",
"subscriptions": [{ "event_type": "user.created" }],
"destination": {
"type": "webhook",
"configuration": {
"webhook_endpoint": "https://example.com/events",
"webhook_authorization": {
"method": "bearer"
}
}
}
}For more details, see the Management API documentation.
Rate Limit Policies allow you to control the rate at which clients can make authentication requests to the OAuth authentication API. Each policy targets a specific consumer selector (e.g. a specific client, all third-party clients, or a default fallback) and defines the action to take when the limit is exceeded.
| Property | Type | Required | Description |
|---|---|---|---|
resource |
string |
Yes | The API protected by the policy. Currently only oauth_authentication_api is supported. |
consumer |
string |
Yes | The consumer type. Currently only client is supported. |
consumer_selector |
string |
Yes | Identifies the target within the consumer. Supported values: client_id:<client_id> to target a specific client, cimd_clients for all CIMD clients, third_party_clients for all third-party clients, or default as a fallback for any unmatched consumer. |
configuration.action |
string |
Yes | The action to take when the rate limit is exceeded. One of: allow, block, log, redirect. |
configuration.limit |
number |
Required for block, log, redirect |
Maximum number of requests allowed in a refresh window. |
configuration.redirect_uri |
string |
Required for redirect |
The HTTPS URI to redirect to when the rate limit is exceeded. |
# Contents of ./tenant.yaml
rateLimitPolicies:
- resource: oauth_authentication_api
consumer: client
consumer_selector: default
configuration:
action: block
limit: 100
- resource: oauth_authentication_api
consumer: client
consumer_selector: third_party_clients
configuration:
action: log
limit: 50
- resource: oauth_authentication_api
consumer: client
consumer_selector: client_id:some-client-id
configuration:
action: redirect
limit: 10
redirect_uri: https://example.com/rate-limitedFolder: ./rate-limit-policies/
Each rate limit policy is stored as a separate JSON file named after its consumer_selector (e.g. default.json):
{
"resource": "oauth_authentication_api",
"consumer": "client",
"consumer_selector": "default",
"configuration": {
"action": "block",
"limit": 100
}
}For more details, see the Management API documentation.
The Deploy CLI supports managing client authentication credentials for Private Key JWT and mTLS. Credentials are child resources of clients, managed via the /clients/{id}/credentials API.
Export: client_authentication_methods is exported with credential stubs containing only name and credential_type. The pem field is never exported — Auth0 does not return it after creation. If no named credentials exist for a client, client_authentication_methods is omitted entirely from the export.
Deploy: Credential reconciliation only activates when at least one credential in the config contains a pem field. This means a plain export→deploy will never delete existing credentials — pem is the explicit opt-in signal.
- Creates credentials present in config but missing in Auth0
- Deletes credentials removed from config (requires
AUTH0_ALLOW_DELETE=true) - Creates always run before deletes — Auth0 allows max 2 credentials per client, so both exist simultaneously during the rotation window
- Re-wires
client_authentication_methodswith resolved credential IDs after reconciliation - If
client_authentication_methodsis absent from the client config entirely, it is treated as intentional deletion — all existing credentials are removed (requiresAUTH0_ALLOW_DELETE=true)
credential_type |
Auth method key | Use case |
|---|---|---|
public_key |
private_key_jwt |
Private Key JWT |
x509_cert |
self_signed_tls_client_auth |
mTLS (self-signed cert) |
cert_subject_dn |
tls_client_auth |
mTLS (CA-signed cert, subject DN) |
Beyond name, credential_type, and pem, the following optional fields are forwarded to Auth0 when a public_key (private_key_jwt) credential is created (see the Management API docs):
| Field | Notes |
|---|---|
kid |
Key ID. If omitted, Auth0 auto-generates one. Format: [0-9a-zA-Z-_]{10,64} |
alg |
Signing algorithm: RS256, RS384, or PS256 |
expires_at |
ISO 8601 expiry. If omitted, the credential never expires |
parse_expiry_from_cert |
Parse the expiry from the X509 certificate supplied in pem |
Note: These fields are honored only when the credential is created (matching is by
name). Changing a field such askidon an existing credential with the samenameis a no-op — rotate by adding a new credential under a newnameand removing the old one.kidis not exported (Auth0 returns onlynameandcredential_typeon read).
To add or rotate a credential:
-
Generate a key pair:
openssl genrsa -out private.key 2048 openssl rsa -in private.key -pubout -out public.pem
-
Add the credential to your client config with the public key
pem:clients: - name: My API Client client_authentication_methods: private_key_jwt: credentials: - name: my-key-v2 credential_type: public_key kid: my-custom-kid # optional; auto-generated if omitted alg: RS256 # optional pem: | -----BEGIN PUBLIC KEY----- MIIBIjANBgkq... -----END PUBLIC KEY-----
-
Deploy — the credential is created in Auth0 and
client_authentication_methodsis updated. -
To rotate: add the new key alongside the old one (both exist simultaneously), then remove the old one in a subsequent deploy.
clients:
- name: My API Client
client_authentication_methods:
private_key_jwt:
credentials:
- name: my-key-v2
credential_type: public_keyIf no credentials exist for the client, client_authentication_methods is omitted entirely — not exported as an empty object.
./clients/
./My API Client.json
Contents of My API Client.json (deploy-time, with pem):
{
"name": "My API Client",
"client_authentication_methods": {
"private_key_jwt": {
"credentials": [
{
"name": "my-key-v2",
"credential_type": "public_key",
"pem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkq...\n-----END PUBLIC KEY-----\n"
}
]
}
}
}Note: The
pemfield must be supplied manually from your key generation step. Never commit private keys — only the public key PEM goes in the config.
Early Access:
token_vault_privileged_accessrequires thetoken_vault_subject_type_jwt_ea_rolloutfeature flag to be enabled on the tenant, and writes additionally require thecreate:client_token_vault_privileged_access/update:client_token_vault_privileged_accessscopes. This field is export-only in the Deploy CLI (see below), so these requirements affect only manual configuration on the tenant, not the CLI.
The Deploy CLI exports the token_vault_privileged_access property on clients, which hardens a privileged Token Vault worker by restricting the caller IPs, connections, and scopes it may use at runtime.
Export-only field:
token_vault_privileged_accessis exported for visibility but is not deployed by the Deploy CLI — it is stripped from create/update payloads. The Management API requires acredentialsarray (tenant-specific credentialidreferences) whenever the object is sent, and those ids are never persisted by the CLI because they are not portable across tenants. Sending the object without them fails validation, and sending exported ids would re-send stale references on a cross-tenant deploy. Managetoken_vault_privileged_accessdirectly on the tenant.
| Field | Type | Description |
|---|---|---|
ip_allowlist |
array of strings | IPv4/IPv6 addresses or CIDR ranges permitted to call token exchange on behalf of this client. |
grants |
array of objects | Connection/scope pin objects. Each has a connection (name) and scopes (array). Max 5 connections; max 20 scopes total. |
Exported shape (credentials is stripped; ip_allowlist and grants are kept for visibility):
clients:
- name: My Token Vault Privileged App
app_type: non_interactive
token_vault_privileged_access:
ip_allowlist:
- '192.168.1.0/24'
- '10.0.0.1'
grants:
- connection: google-oauth2
scopes:
- 'https://www.googleapis.com/auth/calendar.readonly'
- connection: slack
scopes:
- 'chat:write'
- 'channels:read'The Deploy CLI manages the MFA (Guardian) advanced factor settings through three separate resources. Each is a single object rather than a set, so it cannot be deleted; an empty or omitted value is skipped rather than treated as a deletion. If the feature is unavailable on the tenant, the resource is skipped gracefully.
guardianPhoneFactorSettings: one-time password settings for the phone factor.otp_length(number): number of digits in the OTP code.otp_expiration_time(number): OTP validity window, in seconds.
guardianEmailFactorSettings: one-time password settings for the email factor, with the same fields as the phone factor.guardianSettings: MFA session and "Remember Me" behavior.display_remember_me_checkbox(boolean): whether to show the "Remember Me" checkbox on the MFA prompt in Universal Login.remember_me_default_value(boolean): default state of that checkbox.mfa_session_inactivity_timeout(number): inactivity duration, in seconds, after which the user is prompted for MFA. Cannot exceed the overall timeout.mfa_session_overall_timeout(number): maximum duration, in seconds, after which the user is prompted for MFA regardless of activity.
# Contents of ./tenant.yaml
guardianPhoneFactorSettings:
otp_length: 6
otp_expiration_time: 300
guardianEmailFactorSettings:
otp_length: 6
otp_expiration_time: 300
guardianSettings:
display_remember_me_checkbox: true
remember_me_default_value: false
mfa_session_inactivity_timeout: 604800
mfa_session_overall_timeout: 2592000Each resource is a JSON file inside the guardian folder:
// Contents of ./guardian/phoneFactorSettings.json
{
"otp_length": 6,
"otp_expiration_time": 300
}// Contents of ./guardian/emailFactorSettings.json
{
"otp_length": 6,
"otp_expiration_time": 300
}// Contents of ./guardian/settings.json
{
"display_remember_me_checkbox": true,
"remember_me_default_value": false,
"mfa_session_inactivity_timeout": 604800,
"mfa_session_overall_timeout": 2592000
}For more details, see the Management API documentation.