The following examples demonstrate common integration patterns using the CCM External API.
JavaScript / Node.js
Adding Websites
const axios = require('axios');
const CCM_BASE_URL = 'https://<your-ccm-domain>/external/v1';
const TOKEN = process.env.CCM_API_TOKEN;
async function addWebsites(cmUuid, websites) {
const response = await axios.post(
`${CCM_BASE_URL}/websites`,
{ cmUuid, websites },
{ headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' } }
);
const results = response.data;
results.forEach(r => {
if (r.status === 'SUCCESS') {
console.log(`Added: ${r.url}`);
} else {
console.warn(`Failed: ${r.url} — ${r.message}`);
}
});
}
addWebsites('a1b2c3d4-...', ['https://example.com']);
Triggering a Scan
async function triggerScan(cmUuid, websiteId) {
try {
const response = await axios.post(
`${CCM_BASE_URL}/scans`,
{ cmUuid, websiteId, scanType: 'FULL' },
{ headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' } }
);
console.log('Scan queued:', response.data.scanId);
return response.data;
} catch (err) {
if (err.response?.status === 409) {
console.warn('Scan already in progress for this website.');
} else if (err.response?.status === 404) {
console.error('Website not found. Ensure it is registered first.');
} else {
throw err;
}
}
}
Python
Adding and Removing Websites
import os, requests
BASE_URL = 'https://<your-ccm-domain>/external/v1'
HEADERS = {
'Authorization': f'Bearer {os.environ["CCM_API_TOKEN"]}',
'Content-Type': 'application/json'
}
def add_websites(cm_uuid, websites):
resp = requests.post(
f'{BASE_URL}/websites',
json={'cmUuid': cm_uuid, 'websites': websites},
headers=HEADERS
)
resp.raise_for_status()
return resp.json()
def remove_websites(cm_uuid, websites):
resp = requests.delete(
f'{BASE_URL}/websites',
json={'cmUuid': cm_uuid, 'websites': websites},
headers=HEADERS
)
resp.raise_for_status()
return resp.json()
# Example usage
results = add_websites('a1b2c3d4-...', ['https://example.com'])
for r in results:
print(r['url'], '->', r['status'])
Java (Spring Boot)
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class CcmApiClient {
private final WebClient webClient;
public CcmApiClient(@Value('${ccm.base-url}') String baseUrl,
@Value('${ccm.token}') String token) {
this.webClient = WebClient.builder()
.baseUrl(baseUrl)
.defaultHeader("Authorization", "Bearer " + token)
.defaultHeader("Content-Type", "application/json")
.build();
}
public Mono<List<WebsiteResultDTO>> addWebsites(String cmUuid, List<String> websites) {
var body = Map.of("cmUuid", cmUuid, "websites", websites);
return webClient.post()
.uri("/external/v1/websites")
.bodyValue(body)
.retrieve()
.bodyToFlux(WebsiteResultDTO.class)
.collectList();
}
}
CI/CD Pipeline Integration (GitHub Actions)
The following example triggers a CCM scan after a production deployment:
name: Post-Deploy CCM Scan
on:
deployment_status:
types: [success]
jobs:
trigger-scan:
if: github.event.deployment_status.environment == 'production'
runs-on: ubuntu-latest
steps:
- name: Trigger CCM Cookie Scan
run: |
curl -X POST \
${{ secrets.CCM_BASE_URL }}/external/v1/scans \
-H "Authorization: Bearer ${{ secrets.CCM_API_TOKEN }}" \
-H "Content-Type: application/json" \
-d '{
"cmUuid": "${{ secrets.CCM_UUID }}",
"websiteId": "${{ secrets.CCM_WEBSITE_ID }}"
}'
TrustArc · CCM External API · https://trustarc.com/