Integration Examples

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/