CONFIGURATION → PREVIEW → ACTIVE → IN PROGRESS → COMPLETED → REMEDIATION
│ │ │ │ │ │
│ │ │ │ │ └── Revoke tickets
│ │ │ │ │ executed
│ │ │ │ │
│ │ │ │ └── All decisions
│ │ │ │ collected
│ │ │ │
│ │ │ └── Certifiers reviewing
│ │ │ and making decisions
│ │ │
│ │ └── Campaign launched,
│ │ notifications sent
│ │
│ └── Read-only preview for validation
│
└── Campaign parameters defined
import requests
SAVIYNT_URL = "https://tenant.saviyntcloud.com"
SAVIYNT_TOKEN = "your-api-token"
def create_certification_campaign(campaign_config):
"""Create and launch a Saviynt certification campaign."""
headers = {
"Authorization": f"Bearer {SAVIYNT_TOKEN}",
"Content-Type": "application/json"
}
response = requests.post(
f"{SAVIYNT_URL}/ECM/api/v5/createCampaign",
headers=headers,
json={
"campaignname": campaign_config["name"],
"campaigntype": campaign_config["type"],
"description": campaign_config["description"],
"certifier": campaign_config["certifier_type"],
"duedate": campaign_config["due_date"],
"reminderdays": campaign_config["reminder_days"],
"autorevoke": campaign_config.get("auto_revoke", True),
"autorevokedays": campaign_config.get("auto_revoke_days", 15),
"scope": campaign_config.get("scope", {}),
}
)
response.raise_for_status()
campaign_id = response.json().get("campaignId")
launch_response = requests.post(
f"{SAVIYNT_URL}/ECM/api/v5/launchCampaign",
headers=headers,
json={"campaignId": campaign_id}
)
launch_response.raise_for_status()
return {
"campaign_id": campaign_id,
"status": "launched",
"certifications_created": launch_response.json().get("certificationCount", 0)
}
def get_campaign_status(campaign_id):
"""Get current status and progress of a campaign."""
headers = {"Authorization": f"Bearer {SAVIYNT_TOKEN}"}
response = requests.get(
f"{SAVIYNT_URL}/ECM/api/v5/getCampaignDetails",
headers=headers,
params={"campaignId": campaign_id}
)
response.raise_for_status()
data = response.json()
return {
"campaign_id": campaign_id,
"status": data.get("status"),
"total_items": data.get("totalLineItems", 0),
"certified": data.get("certifiedCount", 0),
"revoked": data.get("revokedCount", 0),
"pending": data.get("pendingCount", 0),
"completion_rate": data.get("completionPercentage", 0),
}