diff --git a/logs/logs.go b/logs/logs.go
index d9aaf9fda10ad62329f0f71ea71bb4dbf6d1c0a4..a9d7a189583c248fc0e5ac1bbcb5271e51062006 100644
--- a/logs/logs.go
+++ b/logs/logs.go
@@ -51,6 +51,7 @@ var raygunClient *raygun4go.Client
 // Password filtering
 var passwordRegex = regexp.MustCompile(`(?i:\\?"password\\?"\s*:\s*\\?"(.*)\\?").*`)
 var byteArrayRegex = regexp.MustCompile(`(?i:\\?"(?i:[\w]*)(?i:byte|data)(?i:[\w]*)\\?"\s*:\s*\[([\d\s,]+)*\])`)
+var creditCardDetailsRegex = regexp.MustCompile(`(?i)"(?:card_number|card_expiry_year|card_expiry_month|card_cvv)"\s*:\s*(?:")?([^,"}]+)(?:")?`)
 
 func SanitiseLogs(logString string) string {
 	var isValidJsonString bool
@@ -61,6 +62,7 @@ func SanitiseLogs(logString string) string {
 
 	logString = MaskByteArraysInJsonString(logString)
 	logString = MaskPasswordsInJsonString(logString)
+	logString = MaskCreditCardDetailsInJsonString(logString)
 
 	return logString
 }
@@ -77,6 +79,12 @@ func MaskByteArraysInJsonString(jsonString string) string {
 	return string_utils.ReplaceAllRegexStringSubmatch(byteArrayRegex, jsonString, "...")
 }
 
+// MaskCreditCardDetailsInJsonString takes a string and sanitises all the instances of fields named card_number,
+// "card_number" will become "{"card_number": "***"}"
+func MaskCreditCardDetailsInJsonString(jsonString string) string {
+	return string_utils.ReplaceAllRegexStringSubmatch(creditCardDetailsRegex, jsonString, "***")
+}
+
 func SanitiseFields(fields map[string]interface{}) map[string]interface{} {
 	sanitisedFields := make(map[string]interface{})
 
@@ -491,7 +499,7 @@ func sendRaygunError(fields map[string]interface{}, errToSend error) {
 	if apiRequest != nil {
 		methodAndPath := apiRequest.HTTPMethod + ": " + apiRequest.Path
 		tags = append(tags, methodAndPath)
-		fields["body"] = apiRequest.Body
+		fields["body"] = SanitiseLogs(apiRequest.Body)
 		fields["query"] = apiRequest.QueryStringParameters
 		fields["identity"] = apiRequest.RequestContext.Identity
 	}