Skip to main content
The Client Management API allows you to programmatically manage Auth0 applications (also known as clients).

Prerequisites

Ensure you have initialized a management client:
import (
    "context"
    "github.com/auth0/go-auth0/v2/management"
    "github.com/auth0/go-auth0/v2/management/client"
    "github.com/auth0/go-auth0/v2/management/option"
)

mgmt, err := client.New(
    "your-tenant.auth0.com",
    option.WithClientCredentials(
        context.Background(),
        "YOUR_CLIENT_ID",
        "YOUR_CLIENT_SECRET",
    ),
)

Application Types

Auth0 supports several application types:
  • Native - Mobile or desktop applications
  • SPA - Single Page Applications (JavaScript)
  • Regular Web Application - Traditional server-side web apps
  • Machine to Machine - Backend services and APIs

Creating Clients

Create a SPA client for JavaScript applications:
createRequest := &management.CreateClientRequestContent{
    Name:    "My React App",
    AppType: &management.ClientAppTypeEnumSpa,
    Callbacks: []string{
        "http://localhost:3000/callback",
        "https://myapp.com/callback",
    },
    AllowedOrigins: []string{
        "http://localhost:3000",
        "https://myapp.com",
    },
    WebOrigins: []string{
        "http://localhost:3000",
        "https://myapp.com",
    },
    AllowedLogoutUrls: []string{
        "http://localhost:3000",
        "https://myapp.com",
    },
    OidcConformant: management.Bool(true),
    JwtConfiguration: &management.ClientJwtConfiguration{
        Algorithm:         management.String("RS256"),
        LifetimeInSeconds: management.Int(3600),
    },
}

client, err := mgmt.Clients.Create(ctx, createRequest)
if err != nil {
    return err
}

fmt.Printf("Created client: %s (ID: %s)\n",
    *client.GetName(),
    *client.GetClientID(),
)

Reading Clients

Get a Single Client

clientID := "abc123xyz789"

client, err := mgmt.Clients.Read(ctx, clientID)
if err != nil {
    return err
}

fmt.Printf("Client: %s\n", *client.GetName())
fmt.Printf("Type: %s\n", *client.GetAppType())
fmt.Printf("Callbacks: %v\n", client.Callbacks)

List All Clients

listRequest := &management.ListClientsRequestParameters{
    PerPage: management.Int(25),
}

clientsPage, err := mgmt.Clients.List(ctx, listRequest)
if err != nil {
    return err
}

for _, client := range clientsPage.Results {
    fmt.Printf("Client: %s (%s)\n",
        *client.GetName(),
        *client.GetClientID(),
    )
}

Filter by Application Type

listRequest := &management.ListClientsRequestParameters{
    AppType: management.String("spa"),
    PerPage: management.Int(50),
}

clientsPage, err := mgmt.Clients.List(ctx, listRequest)

Select Specific Fields

import "net/url"

queryParams := url.Values{}
queryParams.Set("fields", "client_id,name,app_type,callbacks")
queryParams.Set("include_fields", "true")

listRequest := &management.ListClientsRequestParameters{
    AppType: management.String("spa"),
}

clientsPage, err := mgmt.Clients.List(
    ctx,
    listRequest,
    option.WithQueryParameters(queryParams),
)

Updating Clients

Update basic client information:
updateRequest := &management.UpdateClientRequestContent{
    Name:        management.String("My Updated App"),
    Description: management.String("Updated description"),
    LogoURI:     management.String("https://example.com/logo.png"),
}

client, err := mgmt.Clients.Update(ctx, clientID, updateRequest)

Advanced Client Configuration

Configure Refresh Tokens

updateRequest := &management.UpdateClientRequestContent{
    RefreshToken: &management.ClientRefreshToken{
        RotationType:   management.ClientRefreshTokenRotationTypeEnumRotating.Ptr(),
        ExpirationType: management.ClientRefreshTokenExpirationTypeEnumExpiring.Ptr(),
        Leeway:         management.Int(0),
        TokenLifetime:  management.Int(2592000), // 30 days
        InfiniteTokenLifetime:           management.Bool(false),
        InfiniteIdleTokenLifetime:       management.Bool(false),
        IdleTokenLifetime:               management.Int(1296000), // 15 days
    },
}

client, err := mgmt.Clients.Update(ctx, clientID, updateRequest)

Configure CORS Settings

updateRequest := &management.UpdateClientRequestContent{
    AllowedOrigins: []string{
        "https://myapp.com",
        "https://staging.myapp.com",
    },
    WebOrigins: []string{
        "https://myapp.com",
        "https://staging.myapp.com",
    },
    CrossOriginAuth: management.Bool(false),
}

client, err := mgmt.Clients.Update(ctx, clientID, updateRequest)

Configure Mobile Settings

updateRequest := &management.UpdateClientRequestContent{
    Mobile: &management.ClientMobile{
        Android: &management.ClientMobileAndroid{
            AppPackageName: management.String("com.myapp.mobile"),
            Sha256CertFingerprints: []string{
                "AB:CD:EF:12:34:56:78:90",
            },
        },
        Ios: &management.ClientMobileIos{
            TeamID:      management.String("TEAM123"),
            AppBundleIdentifier: management.String("com.myapp.mobile"),
        },
    },
}

client, err := mgmt.Clients.Update(ctx, clientID, updateRequest)

Client Metadata

Add custom metadata to clients using WithBodyProperties:
import "github.com/auth0/go-auth0/v2/management/option"

customMetadata := map[string]interface{}{
    "custom_domain_verified": true,
    "integration_metadata": map[string]interface{}{
        "source":      "terraform",
        "environment": "production",
        "team":        "platform",
        "cost_center": "engineering",
    },
    "feature_flags": map[string]bool{
        "beta_features": true,
        "analytics":     true,
    },
}

createRequest := &management.CreateClientRequestContent{
    Name:    "My App with Metadata",
    AppType: &management.ClientAppTypeEnumSpa,
}

client, err := mgmt.Clients.Create(
    ctx,
    createRequest,
    option.WithBodyProperties(customMetadata),
)

Pagination

Iterate through all clients efficiently:
listRequest := &management.ListClientsRequestParameters{
    PerPage: management.Int(50),
}

clientsPage, err := mgmt.Clients.List(ctx, listRequest)
if err != nil {
    return err
}

iterator := clientsPage.Iterator()
for iterator.Next(ctx) {
    client := iterator.Current()
    fmt.Printf("Client: %s (%s)\n",
        *client.GetName(),
        *client.GetClientID(),
    )
}

if iterator.Err() != nil {
    return iterator.Err()
}

Deleting Clients

err := mgmt.Clients.Delete(ctx, clientID)
if err != nil {
    return err
}

fmt.Printf("Deleted client: %s\n", clientID)
Deleting a client is permanent and will break any applications using that client ID.

Working with Client Grants

List Client Grants

listRequest := &management.ListClientGrantsRequestParameters{
    ClientID: management.String(clientID),
}

grantsPage, err := mgmt.ClientGrants.List(ctx, listRequest)
if err != nil {
    return err
}

for _, grant := range grantsPage.Results {
    fmt.Printf("Grant ID: %s\n", *grant.GetID())
    fmt.Printf("Audience: %s\n", *grant.GetAudience())
    fmt.Printf("Scopes: %v\n", grant.Scope)
}

Create Client Grant

createGrantRequest := &management.CreateClientGrantRequestContent{
    ClientID: clientID,
    Audience: "https://api.example.com",
    Scope: []string{
        "read:data",
        "write:data",
    },
}

grant, err := mgmt.ClientGrants.Create(ctx, createGrantRequest)

Update Client Grant

updateGrantRequest := &management.UpdateClientGrantRequestContent{
    Scope: []string{
        "read:data",
        "write:data",
        "delete:data",
    },
}

grant, err := mgmt.ClientGrants.Update(ctx, grantID, updateGrantRequest)

Rotating Client Secrets

// Rotate the client secret
client, err := mgmt.Clients.RotateSecret(ctx, clientID)
if err != nil {
    return err
}

fmt.Printf("New client secret: %s\n", *client.GetClientSecret())
Rotating a client secret immediately invalidates the old secret. Update all applications using the old secret before rotating.

Complete Example

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/auth0/go-auth0/v2/management"
    "github.com/auth0/go-auth0/v2/management/client"
    "github.com/auth0/go-auth0/v2/management/option"
)

func main() {
    mgmt, err := client.New(
        "your-tenant.auth0.com",
        option.WithClientCredentials(
            context.Background(),
            "YOUR_CLIENT_ID",
            "YOUR_CLIENT_SECRET",
        ),
    )
    if err != nil {
        log.Fatalf("Error creating management client: %v", err)
    }

    ctx := context.Background()

    // Create a new SPA client
    createRequest := &management.CreateClientRequestContent{
        Name:    "My React App",
        AppType: &management.ClientAppTypeEnumSpa,
        Callbacks: []string{
            "http://localhost:3000/callback",
            "https://myapp.com/callback",
        },
        AllowedOrigins: []string{
            "http://localhost:3000",
            "https://myapp.com",
        },
        OidcConformant: management.Bool(true),
        JwtConfiguration: &management.ClientJwtConfiguration{
            Algorithm:         management.String("RS256"),
            LifetimeInSeconds: management.Int(3600),
        },
    }

    newClient, err := mgmt.Clients.Create(ctx, createRequest)
    if err != nil {
        log.Fatalf("Error creating client: %v", err)
    }

    fmt.Printf("Created client: %s (ID: %s)\n",
        *newClient.GetName(),
        *newClient.GetClientID(),
    )

    // List all SPA clients
    listRequest := &management.ListClientsRequestParameters{
        AppType: management.String("spa"),
        Fields:  management.String("client_id,name,app_type,callbacks"),
        IncludeFields: management.Bool(true),
        PerPage: management.Int(10),
    }

    clientsPage, err := mgmt.Clients.List(ctx, listRequest)
    if err != nil {
        log.Fatalf("Error listing clients: %v", err)
    }

    fmt.Println("\nSPA Clients:")
    iterator := clientsPage.Iterator()
    for iterator.Next(ctx) {
        c := iterator.Current()
        fmt.Printf("- %s (%s)\n",
            *c.GetName(),
            *c.GetClientID(),
        )
    }

    if iterator.Err() != nil {
        log.Fatalf("Error iterating clients: %v", iterator.Err())
    }

    // Update the client
    updateRequest := &management.UpdateClientRequestContent{
        Description: management.String("Updated description for my app"),
        LogoURI:     management.String("https://example.com/logo.png"),
    }

    updatedClient, err := mgmt.Clients.Update(
        ctx,
        *newClient.GetClientID(),
        updateRequest,
    )
    if err != nil {
        log.Fatalf("Error updating client: %v", err)
    }

    fmt.Printf("\nUpdated client description: %s\n",
        *updatedClient.GetDescription(),
    )
}

Next Steps

User Management

Learn how to manage users

Connection Management

Learn how to manage connections

Request Options

Customize client operations with request options

Build docs developers (and LLMs) love