Skip to content

Credential Sync

Credential sync eliminates the manual step between rotating a credential in VeraID and updating it in the systems that consume it. When a credential is rotated, VeraID automatically pushes the new value to one or more configured sync targets — secret managers, CI/CD platforms, and orchestration systems — so your services pick up the new credential without human intervention.

Supported Sync Targets

VeraID supports six sync targets out of the box, covering the most common secret storage and CI/CD platforms.

TargetIdentifierDescription
AWS Secrets ManagerAWS_SECRETS_MANAGERSyncs credentials to AWS Secrets Manager as secret values
Kubernetes SecretsKUBERNETES_SECRETUpdates Kubernetes Secret resources in specified namespaces
GitHub Actions SecretsGITHUB_ACTIONSPushes credentials to GitHub repository or organization secrets
GitLab CI VariablesGITLAB_CIUpdates GitLab CI/CD variables at project or group level
CircleCI ContextsCIRCLECI_CONTEXTSyncs credentials to CircleCI context environment variables
Jenkins CredentialsJENKINSUpdates Jenkins credential store entries

How Sync Works

Credential sync executes as part of the rotation lifecycle, immediately after a new credential is issued.

Rotation triggered
New credential issued
Sync to Target 1 ──► Success ✓
Sync to Target 2 ──► Success ✓
Sync to Target 3 ──► Failure ✗ ──► Retry (up to 3 attempts)
│ │
│ Still failing?
│ │
│ ▼
│ Rollback all targets
│ Revert to old credential
│ Alert operators
All targets synced ──► Grace period begins

Sync Order

  1. Sequential execution — Targets are synced in the order they are defined in the rotation schedule. Each target must succeed before the next one begins.
  2. Retry logic — If a sync operation fails, VeraID retries up to 3 times with exponential backoff (1s, 5s, 15s).
  3. Rollback on failure — If all retry attempts fail for any target, VeraID rolls back all previously synced targets to the old credential value and reverts the rotation. The old credential remains active, and operators are alerted.

Configuring Sync Targets

Sync targets are configured as part of a rotation schedule or directly on a credential’s rotation policy.

AWS Secrets Manager

{
"type": "AWS_SECRETS_MANAGER",
"config": {
"region": "us-east-1",
"secretName": "/production/payment-service/api-key",
"roleArn": "arn:aws:iam::123456789012:role/veraid-sync-role",
"versionStage": "AWSCURRENT"
}
}
FieldRequiredDescription
regionYesAWS region where the secret is stored
secretNameYesFull secret name or ARN
roleArnYesIAM role ARN that VeraID assumes for cross-account access
versionStageNoVersion stage label (defaults to AWSCURRENT)

Kubernetes Secrets

{
"type": "KUBERNETES_SECRET",
"config": {
"clusterName": "production-us-east",
"namespace": "payments",
"secretName": "api-credentials",
"key": "PAYMENT_API_KEY",
"kubeConfigSecret": "veraid-kubeconfig-prod"
}
}
FieldRequiredDescription
clusterNameYesIdentifier for the target Kubernetes cluster
namespaceYesKubernetes namespace containing the Secret
secretNameYesName of the Kubernetes Secret resource
keyYesKey within the Secret’s data map to update
kubeConfigSecretYesReference to the stored kubeconfig for cluster access

GitHub Actions Secrets

{
"type": "GITHUB_ACTIONS",
"config": {
"owner": "acme-corp",
"repository": "web-app",
"secretName": "VERAID_API_KEY",
"scope": "repository"
}
}
FieldRequiredDescription
ownerYesGitHub organization or user
repositoryConditionalRepository name (required when scope is repository)
secretNameYesName of the GitHub Actions secret
scopeYesrepository or organization

GitLab CI Variables

{
"type": "GITLAB_CI",
"config": {
"projectId": 12345678,
"key": "VERAID_API_KEY",
"environmentScope": "production",
"masked": true,
"protected": true
}
}
FieldRequiredDescription
projectIdYesGitLab project ID (numeric)
keyYesCI/CD variable key name
environmentScopeNoEnvironment scope (defaults to * for all environments)
maskedNoWhether the variable is masked in job logs (defaults to true)
protectedNoWhether the variable is only available in protected branches (defaults to true)

CircleCI Contexts

{
"type": "CIRCLECI_CONTEXT",
"config": {
"organizationId": "org-uuid-here",
"contextName": "production-secrets",
"variableName": "VERAID_API_KEY"
}
}
FieldRequiredDescription
organizationIdYesCircleCI organization UUID
contextNameYesName of the CircleCI context
variableNameYesEnvironment variable name within the context

Jenkins Credentials

{
"type": "JENKINS",
"config": {
"baseUrl": "https://jenkins.internal.acme.com",
"credentialId": "veraid-api-key",
"domain": "_",
"scope": "GLOBAL"
}
}
FieldRequiredDescription
baseUrlYesJenkins server URL
credentialIdYesID of the credential entry in Jenkins
domainNoJenkins credential domain (defaults to _ for global)
scopeNoGLOBAL or SYSTEM (defaults to GLOBAL)

Multi-Target Sync Example

A complete rotation schedule with multiple sync targets:

Terminal window
curl -X POST https://app.veraid.io/api/v1/rotation-schedules \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "payment-service-rotation",
"intervalDays": 30,
"gracePeriodHours": 12,
"notifyDaysBefore": 5,
"notifyChannels": ["email", "webhook"],
"syncTargets": [
{
"type": "AWS_SECRETS_MANAGER",
"config": {
"region": "us-east-1",
"secretName": "/prod/payment-service/api-key",
"roleArn": "arn:aws:iam::123456789012:role/veraid-sync"
}
},
{
"type": "KUBERNETES_SECRET",
"config": {
"clusterName": "production-us-east",
"namespace": "payments",
"secretName": "api-credentials",
"key": "PAYMENT_API_KEY",
"kubeConfigSecret": "veraid-kubeconfig-prod"
}
},
{
"type": "GITHUB_ACTIONS",
"config": {
"owner": "acme-corp",
"repository": "payment-service",
"secretName": "VERAID_API_KEY",
"scope": "repository"
}
}
]
}'

Sync Authentication

Each sync target requires VeraID to authenticate with the external platform. Credentials for sync target access are stored securely in VeraID and are separate from the credentials being rotated.

TargetAuthentication Method
AWS Secrets ManagerIAM role assumption via STS (cross-account)
Kubernetes SecretsKubeconfig with service account token
GitHub ActionsGitHub App installation token or personal access token
GitLab CIProject or group access token
CircleCICircleCI API token
JenkinsJenkins API token with credentials permission

Monitoring Sync Status

Sync Events in Audit Log

Every sync operation is recorded in the audit log with target-level detail:

Terminal window
curl -X GET "https://app.veraid.io/api/v1/audit?action=credential.synced&limit=10" \
-H "Authorization: Bearer kd_live_your_api_key"
{
"data": [
{
"id": "aud_sync_event_id",
"action": "credential.synced",
"credentialId": "crd_9f24d67e-a1b3-4c5d-8e7f-2a3b4c5d6e7f",
"syncResults": [
{ "target": "AWS_SECRETS_MANAGER", "status": "success", "duration": 342 },
{ "target": "KUBERNETES_SECRET", "status": "success", "duration": 1205 },
{ "target": "GITHUB_ACTIONS", "status": "success", "duration": 876 }
],
"timestamp": "2026-03-19T10:00:05Z"
}
]
}

Failed Sync Alerts

When a sync operation fails after all retries, VeraID sends alerts through the rotation schedule’s configured notification channels. The alert includes:

  • Which target failed and the error message
  • Whether rollback was triggered
  • The current state of the credential (old credential restored or new credential active)
  • Recommended remediation steps

What’s Next