Base URL: https://app.cloudfix.com/api/v3
This summary focuses on typical workflows: retrieving and grouping recommendations, acting on them, and reporting.
Authentication
-
Most endpoints require an Authorization header.
-
Supported formats:
-
Authorization: Bearer
-
Authorization: api-token
-
Authorization: cft_
-
-
API tokens can be created in the CloudFix UI (Settings > API Tokens) or via POST /api/v3/tokens.
Public endpoints (no auth required):
-
POST /api/v3/auth/login
curl -s -X POST "https://app.cloudfix.com/api/v3/auth/login" \
-H "Content-Type: application/json" \
-d '{"username":"user@example.com","password":"YOUR_PASSWORD"}'
-
POST /api/v3/auth/refresh
curl -s -X POST "https://app.cloudfix.com/api/v3/auth/refresh" \
-H "Content-Type: application/json" \
-d '{"refreshToken":"<refresh_token>"}'
-
GET /api/v3/reports/view/{hash}
curl -s "https://app.cloudfix.com/api/v3/reports/view/<hash>"
Recommendations (find, group, act)
-
GET /api/v3/recommendations - list recommendations, examples
curl -s "https://app.cloudfix.com/api/v3/recommendations?pageNumber=1&pageLimit=10" \ -H "Authorization: Bearer <token>"
curl -s "https://app.cloudfix.com/api/v3/recommendations?finderFixerId=EbsDeleteOldVolumeSnapshots&pageNumber=1&pageLimit=10" \ -H "Authorization: Bearer <token>"
curl -s "https://app.cloudfix.com/api/v3/recommendations?finderFixerId=EbsDeleteOldVolumeSnapshots&account=123456789012&pageNumber=1&pageLimit=10" \
-H "Authorization: Bearer <token>"
curl -s "https://app.cloudfix.com/api/v3/recommendations/summary?account=123456789012" \ -H "Authorization: Bearer <token>"
-
GET /api/v3/recommendations/summary - grouped summary by type
curl -s "https://app.cloudfix.com/api/v3/recommendations/summary" \ -H "Authorization: Bearer <token>"
-
GET /api/v3/recommendations/summary-filters - valid OU/account/region/tag filters
curl -s "https://app.cloudfix.com/api/v3/recommendations/summary-filters" \ -H "Authorization: Bearer <token>"
-
POST /api/v3/recommendations/postpone - snooze recommendations
curl -s -X POST "https://app.cloudfix.com/api/v3/recommendations/postpone" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"recommendationIds":["rec-123"],"postponeUntil":1735689600000,"reason":"Quarterly review"}'
-
POST /api/v3/recommendations/manual-fix - mark recommendations manually fixed
curl -s -X POST "https://app.cloudfix.com/api/v3/recommendations/manual-fix" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"recommendationIds":["rec-123"]}'
Execute or schedule changes
-
POST /api/v3/create-change-requests - execute fixers for recommendation IDs (starts an SSM Automation execution per recommendation; the endpoint name predates the move off AWS Change Manager, and it no longer creates a change-template request of any kind)
curl -s -X POST "https://app.cloudfix.com/api/v3/create-change-requests" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"recommendationIds":["rec-123"]}'
Omit executeOnSchedule or send it as false. Every CloudFix tenant now runs fixers through Direct SSM Automation, and this endpoint rejects executeOnSchedule:true with 422 "Using Experimental feature, cannot execute on schedule." Recommendations execute immediately once submitted; there is no per-request scheduling.
-
GET /api/v3/fixers/execution-schedule - view the tenant's maintenance-window cron value
curl -s "https://app.cloudfix.com/api/v3/fixers/execution-schedule" \ -H "Authorization: Bearer <token>"
-
POST /api/v3/fixers/execution-schedule - set the tenant's maintenance-window cron value
curl -s -X POST "https://app.cloudfix.com/api/v3/fixers/execution-schedule" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"fixerExecutionSchedule":"cron(0 2 * * ? *)"}'
This value is stored on the tenant and returned by the GET above, but it is not applied to Direct SSM Automation executions today: fixer executions still run immediately once triggered, regardless of what is configured here. The delayed-start "maintenance window" behavior these endpoints once fed was part of AWS Change Manager and is not active for any tenant now.
Reports and savings
-
GET /api/v3/recommendations/report - fetch a recommendation report by ID
curl -s "https://app.cloudfix.com/api/v3/recommendations/report?recommendationId=rec-123" \ -H "Authorization: Bearer <token>"
-
POST /api/v3/recommendations/share - create a shareable report link
curl -s -X POST "https://app.cloudfix.com/api/v3/recommendations/share" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"recommendationId":"rec-123"}'
The response includes a hash and shareUrl. Fetch the shared report with the public endpoint above: GET /api/v3/reports/view/{hash}.
-
GET /api/v3/report/savings - tenant savings report
curl -s "https://app.cloudfix.com/api/v3/report/savings" \ -H "Authorization: Bearer <token>"
-
GET /api/v3/report/realized-savings - realized savings report
curl -s "https://app.cloudfix.com/api/v3/report/realized-savings" \ -H "Authorization: Bearer <token>"
-
GET /api/v3/savings/history - savings history
curl -s "https://app.cloudfix.com/api/v3/savings/history" \ -H "Authorization: Bearer <token>"
-
POST /api/v3/report/cost-ranking - cost ranking
curl -s -X POST "https://app.cloudfix.com/api/v3/report/cost-ranking" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"minimumPublicAnnualCostFraction":0.01}'
The body is optional; minimumPublicAnnualCostFraction is the only accepted field and falls back to a default when omitted. This endpoint does not take a date range.
Integrations
-
GET /api/v3/events/webhook - list webhooks
curl -s "https://app.cloudfix.com/api/v3/events/webhook" \ -H "Authorization: Bearer <token>"
-
POST /api/v3/events/webhook - create/update webhook
curl -s -X POST "https://app.cloudfix.com/api/v3/events/webhook" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"name":"order-updates","url":"https://example.com/webhook","secret":"supersecretkey","active":true}'
-
DELETE /api/v3/events/webhook - delete webhook
curl -s -X DELETE "https://app.cloudfix.com/api/v3/events/webhook?name=order-updates" \ -H "Authorization: Bearer <token>"
-
POST /api/v3/events/webhook/update-external-id - update external id
curl -s -X POST "https://app.cloudfix.com/api/v3/events/webhook/update-external-id" \
-H "Content-Type: application/json" \
-d '{"externalId":"EXT-123","recommendationId":"rec-123"}'
-
GET /api/v3/integrations/email - list email integrations
curl -s "https://app.cloudfix.com/api/v3/integrations/email" \ -H "Authorization: Bearer <token>"
-
POST /api/v3/integrations/email - create email integration
curl -s -X POST "https://app.cloudfix.com/api/v3/integrations/email" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"email":"alerts@example.com","categories":["category1","category2"]}'
-
PUT /api/v3/integrations/email/{emailIntegrationId} - update email integration
curl -s -X PUT "https://app.cloudfix.com/api/v3/integrations/email/123" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"email":"alerts@example.com","categories":["category1","category2"]}'
-
DELETE /api/v3/integrations/email/{emailIntegrationId} - delete email integration
curl -s -X DELETE "https://app.cloudfix.com/api/v3/integrations/email/123" \ -H "Authorization: Bearer <token>"
-
POST /api/v3/integrations/email/sync - sync email integrations
curl -s -X POST "https://app.cloudfix.com/api/v3/integrations/email/sync" \ -H "Authorization: Bearer <token>"
Not in scope for the API
-
UI rendering and export features (charts, PDF exports, report layout)
-
Viewer-only presentation behavior for shared reports
-
One-click UI execution controls beyond the change-request and scheduling endpoints
-
Client-side analytics and telemetry
Persistence Notes
-
Configuration, recommendations, and reports are stored server-side in CloudFix services.
-
Token lifecycle and revocation are handled by the backend.
-
Exact data retention is plan- and policy-dependent; contact CloudFix Support for retention details.
Bill Gleeson
Comments