Generating Long-Lived API Tokens for CI/CD Pipelines in Genesys Cloud

Can anyone clarify the recommended approach for generating long-lived API tokens specifically for CI/CD pipelines in Genesys Cloud? I am currently automating our deployment processes using Terraform and need a reliable authentication method that does not require interactive user login or frequent token rotation within the pipeline context.

I have reviewed the documentation on OAuth2 flows, but the standard authorization code flow seems unsuitable for headless environments. I attempted to use the client credentials grant by calling the /oauth/token endpoint directly.

“For machine-to-machine communication, use the client credentials grant type. This requires a valid client ID and client secret associated with an integration that has the necessary scopes.”

Here is the curl command I am using in my shell script:

curl -X POST "https://api.mypurecloud.com/oauth/token" \
 -H "Content-Type: application/x-www-form-urlencoded" \
 -d "grant_type=client_credentials&client_id=MY_CLIENT_ID&client_secret=MY_CLIENT_SECRET&scope=api:platform"

The request returns a 200 OK status, and I receive an access_token. However, the expires_in field is set to 3600 seconds. This is problematic for my nightly builds, which can sometimes fail and retry after an hour, causing authentication errors.

Is there a way to request a longer-lived token via the API? Or should I implement a background service that handles token refresh automatically? I want to avoid storing sensitive secrets in plain text within the CI/CD environment variables if possible.

Any code examples or best practices for managing OAuth token lifecycle in automated deployments would be appreciated. I am particularly interested in how to handle the refresh token mechanism if it is applicable here.

Have you tried the client credentials flow? It fits CI/CD perfectly.

var config = new PlatformConfiguration { ClientId = "...", ClientSecret = "..." };
var client = new PureCloudPlatformClientV2(config);
var token = await client.AuthApi.PostOAuthToken("client_credentials", new[] { "admin:api" });

Warning: Rotate secrets via a vault, not env vars.