Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/zitadel/client-ruby/llms.txt

Use this file to discover all available pages before exploring further.

Overview

The InstanceServiceApi provides methods for managing Zitadel instances, including instance lifecycle, custom domains, and trusted domains. Most methods require system-level permissions.

Initialize the API

require 'zitadel/client'

client = Zitadel::Client::ApiClient.new
client.config.access_token = 'YOUR_ACCESS_TOKEN'

instance_api = Zitadel::Client::Api::InstanceServiceApi.new(client)

Instance Management

Returns the instance in the current context or by its ID.Required permissions:
  • iam.read (for current instance)
  • system.instance.read (for specific instance ID)
request = Zitadel::Client::InstanceServiceGetInstanceRequest.new(
  instance_id: 'instance_123' # Optional
)

response = instance_api.get_instance(request)

puts "Instance ID: #{response.instance.id}"
puts "Instance Name: #{response.instance.name}"
puts "Default Org ID: #{response.instance.default_org_id}"
Lists instances matching the given query. Requires system level permissions.Required permission: system.instance.read
request = Zitadel::Client::InstanceServiceListInstancesRequest.new(
  query: {
    limit: 50,
    offset: 0
  },
  queries: [{
    instance_id_query: {
      id: 'instance',
      method: 'TEXT_QUERY_METHOD_CONTAINS'
    }
  }]
)

response = instance_api.list_instances(request)
response.result.each do |instance|
  puts "Instance: #{instance.name} (#{instance.id})"
end
Updates instance’s name in the current context or by its ID.Required permissions:
  • iam.write (for current instance)
  • system.instance.write (for specific instance ID)
request = Zitadel::Client::InstanceServiceUpdateInstanceRequest.new(
  instance_id: 'instance_123', # Optional
  name: 'Updated Instance Name'
)

response = instance_api.update_instance(request)
Deletes an instance with the given ID. Requires system level permissions.Required permission: system.instance.delete
request = Zitadel::Client::InstanceServiceDeleteInstanceRequest.new(
  instance_id: 'instance_123'
)

response = instance_api.delete_instance(request)

Custom Domain Management

Adds a custom domain to the instance. The domain must be unique across all instances and will be used to route requests.Required permission: system.domain.write
request = Zitadel::Client::InstanceServiceAddCustomDomainRequest.new(
  instance_id: 'instance_123',
  domain: 'auth.mycompany.com'
)

response = instance_api.add_custom_domain(request)
puts "Domain added: #{response.domain}"
Lists custom domains of the instance.Required permissions:
  • iam.read (for current instance)
  • system.instance.read (for specific instance ID)
request = Zitadel::Client::InstanceServiceListCustomDomainsRequest.new(
  instance_id: 'instance_123' # Optional
)

response = instance_api.list_custom_domains(request)
response.result.each do |domain|
  puts "Domain: #{domain.domain}, Primary: #{domain.is_primary}"
end
Removes a custom domain from the instance. This will stop routing requests from this domain.Required permission: system.domain.write
request = Zitadel::Client::InstanceServiceRemoveCustomDomainRequest.new(
  instance_id: 'instance_123',
  domain: 'auth.mycompany.com'
)

response = instance_api.remove_custom_domain(request)

Trusted Domain Management

Adds a trusted domain to the instance. Trusted domains can be used in API responses like OIDC discovery and email templates.Required permissions:
  • iam.write (for current instance)
  • system.instance.write (for specific instance ID)
request = Zitadel::Client::InstanceServiceAddTrustedDomainRequest.new(
  instance_id: 'instance_123', # Optional
  domain: 'login.mycompany.com'
)

response = instance_api.add_trusted_domain(request)
puts "Trusted domain added: #{response.domain}"
Lists trusted domains of the instance.Required permissions:
  • iam.read (for current instance)
  • system.instance.read (for specific instance ID)
request = Zitadel::Client::InstanceServiceListTrustedDomainsRequest.new(
  instance_id: 'instance_123' # Optional
)

response = instance_api.list_trusted_domains(request)
response.result.each do |domain|
  puts "Trusted Domain: #{domain}"
end
Removes a trusted domain from the instance.Required permissions:
  • iam.write (for current instance)
  • system.instance.write (for specific instance ID)
request = Zitadel::Client::InstanceServiceRemoveTrustedDomainRequest.new(
  instance_id: 'instance_123', # Optional
  domain: 'login.mycompany.com'
)

response = instance_api.remove_trusted_domain(request)

Custom vs Trusted Domains

Custom Domains

  • Must be unique across all instances
  • Used to route requests to the instance
  • Require system-level permissions
  • Example: auth.mycompany.com

Trusted Domains

  • Can be shared across instances
  • Used in API responses (OIDC discovery, emails)
  • Useful for proxy setups and custom login UIs
  • Example: login.mycompany.com

Example: Set Up Custom Domain

# Add custom domain
add_request = Zitadel::Client::InstanceServiceAddCustomDomainRequest.new(
  instance_id: 'instance_123',
  domain: 'auth.mycompany.com'
)

add_response = instance_api.add_custom_domain(add_request)
puts "Added domain: #{add_response.domain}"

# List all custom domains
list_request = Zitadel::Client::InstanceServiceListCustomDomainsRequest.new(
  instance_id: 'instance_123'
)

list_response = instance_api.list_custom_domains(list_request)
list_response.result.each do |domain|
  puts "Domain: #{domain.domain}"
  puts "  Primary: #{domain.is_primary}"
  puts "  Generated: #{domain.is_generated}"
end

Example: Configure Trusted Domains for Proxy Setup

# Add trusted domain for custom login UI
trusted_request = Zitadel::Client::InstanceServiceAddTrustedDomainRequest.new(
  domain: 'login.mycompany.com'
)

trusted_response = instance_api.add_trusted_domain(trusted_request)

# Now this domain can be used in:
# - OIDC discovery endpoints
# - Email templates
# - Redirect URIs
# - CORS origins

Example: Multi-Instance Management

# List all instances
request = Zitadel::Client::InstanceServiceListInstancesRequest.new(
  query: {
    limit: 100
  }
)

response = instance_api.list_instances(request)

response.result.each do |instance|
  puts "Instance: #{instance.name}"
  puts "  ID: #{instance.id}"
  puts "  State: #{instance.state}"
  
  # Get domains for each instance
  domains_request = Zitadel::Client::InstanceServiceListCustomDomainsRequest.new(
    instance_id: instance.id
  )
  
  domains = instance_api.list_custom_domains(domains_request)
  domains.result.each do |domain|
    puts "  Domain: #{domain.domain}"
  end
end

See Also

Build docs developers (and LLMs) love