I have unexpected charges for my Amazon Personalize campaign, and I want to review and verify these charges.
Resolution
During an active Amazon Personalize campaign, you accrue charges even when you don't make requests. To avoid unnecessary charges, it's a best practice to delete campaigns after you no longer need them. To improve your Amazon Personalize campaign usage, complete the following tasks.
Note: If you receive errors when you run AWS Command Line Interface (AWS CLI) commands, then see Troubleshooting errors for the AWS CLI. Also, make sure that you're using the most recent AWS CLI version.
Review the CloudWatch metrics
Amazon Personalize campaigns have a default billing threshold of 1 transaction per second (TPS) for all active campaigns. You are charged for the maximum value between the minimum TPS that you configure and the actual TPS that you receive for the campaign. To review and verify Amazon Personalize charges from a campaign, use Amazon CloudWatch metrics to monitor when a metric exceeds a defined threshold.
Amazon CloudWatch provides monitoring capabilities to track GetRecommendations and GetPersonalizedRanking API calls made to your campaigns. Use the sum statistic for these metrics to view the total count of successful API operations.
To check for active campaigns and analyze your usage, use the ListCampaigns AWS CLI command to return the campaigns that use the campaign. You can also review the Amazon Personalize metrics in the CloudWatch console.
Audit your API calls
To capture console-based interactions and programmatic API requests, use AWS CloudTrail to review Amazon Personalize API calls as events. Then, use CloudTrail to review detailed information about the calls, including the requester identity and the associated metadata, and use the information to improve your campaigns and costs.
To review Amazon Personalize events in CloudTrail, complete the following steps:
- Open the CloudTrail console.
- In the navigation pane, choose Event history.
- For Lookup attributes, choose Event name and then search by the event name, such as GetRecommendations. You can also filter the events by date and time.
Select the Event name to review the details of the event.
Example event details:
{
"eventVersion": "1.11",
"userIdentity": {
"type": "AssumedRole",
"principalId": "XXXXXXXXXXXXXXXXX",
"arn": "arn:aws:sts::XXXXXXXXXX:assumed-role/role_name",
"accountId": "XXXXXXXXXXX",
"accessKeyId": "XXXXXXXXXXXXXXX",
"sessionContext": {
"sessionIssuer": {
"type": "Role",
"principalId": "XXXXXXXXXXXX",
"arn": "arn:aws:iam::XXXXXXXXXXX:role/service-role/role_name",
"accountId": "XXXXXXXX",
"userName": "role_name"
},
"attributes": {
"creationDate": "2025-11-09T07:08:55Z",
"mfaAuthenticated": "false"
},
"ec2RoleDelivery": "2.0"
}
},
"eventTime": "2025-11-09T07:52:31Z",
"eventSource": "personalize.amazonaws.com",
"eventName": "GetRecommendations",
"awsRegion": "us-east-1",
"sourceIPAddress": "xx.xx.xx.xx.x",
"userAgent": "Boto3/1.40.59 md/Botocore#1.40.59 ua",
"requestParameters": {
"campaignArn": "arn:aws:personalize:us-east-1:xxxxxxxxxxxx:campaign/campaign-name",
"userId": "XXX",
"numResults": 0
},
"responseElements": null,
"requestID": "xxxxxxx-xxxxx-xxxxx-xxxxxx-xxxxxxxx",
"eventID": "xxxxxxx-xxxxx-xxxxx-xxxxxx-xxxxxxxx",
"readOnly": true,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "XXXXXXXXXXXXXX",
"eventCategory": "Management",
"tlsDetails": {
"tlsVersion": "TLSv1.3",
"clientProvidedHostHeader": "personalize-runtime.us-east-1.amazonaws.com"
}
}
To delete a campaign that you no longer need, use the DeleteCampaign API operation. Or, use the delete-campaign AWS CLI command to remove a campaign from your account. Make sure that you provide the Amazon Resource Name (ARN) of your campaign in the command. You can also use AWS SDKs to perform the DeleteCampaign operation.
Understand Amazon Personalize pricing
Charges are based on the number of GetRecommendations API calls made during an active campaign. For the campaign, the default value for minTPS is 1. Example calculation for recommendations:
1 (minTPS value) X 24 (hours per day) X 60 (minutes per hour) X 60 (seconds per minute) = 86,400 recommendations
If you don't make any requests to the campaign, then Amazon Personalize compares your actual recommendations to the default recommendations of 86,400. The actual recommendations that you used is 0 because there aren't calls made.
Amazon Personalize compares the default recommendations value to the actual recommendations that you used. Then, Amazon Personalize charges for the larger value of either the actual recommendation value or the default recommendation value.
86,400 X Rate = Cost
For information on Amazon Personalize pricing, see the Pricing examples section on Amazon Personalize pricing.
Related information
CreateCampaign
Logging Amazon Personalize API calls with AWS CloudTrail