ax-check.com
by Gauge
A
Antimetal
antimetal.com
ax-check.com
Checked 21 October 2026
C
63/100
Agents need your login
Quickstart docs are solid, but pricing is sales-gated everywhere
Docs, API reference and MCP setup all resolve cleanly, but the llms.txt index points to localhost links and no price is ever published on the site.
3 fixes to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no antimetal.com account. Recorded 21 October 2026 on Pi.
3 recorded · 1m 14s
1m 14s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
Let me think about what Antimetal is. Antimetal (antimetal.com) is a company that provides automated management of cloud commitments/reservations for AWS cost optimization — it manages AWS Compute Savings Plans on your behalf. Is there an API/SDK? I'm not sure whether Antimetal has a public SDK or a developer quickstart. Let me check whether network access is available and investigate.
curl -sL --max-time 15 https://www.antimetal.com -o /tmp/am.html && wc -c /tmp/am.html; echo "---"; curl -sL --max-time 15 -o /dev/null -w "%{http_code}\n" https://docs.antimetal.com 2>&1402321 /tmp/am.html
402321 /tmp/am.html --- 200
Recorded tool call
{
"type": "tool_call",
"seq": 3,
"ts": "2026-10-21T15:33:46.512Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 15 https://www.antimetal.com -o /tmp/am.html && wc -c /tmp/am.html; echo \"---\"; curl -sL --max-time 15 -o /dev/null -w \"%{http_code}\\n\" https://docs.antimetal.com 2>&1"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-8463935157ecb050",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 7,
"ts": "2026-10-21T15:33:48.158Z",
"turn": 1,
"output": {
"content": [
{
"text": "402321 /tmp/am.html\n---\n200\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-8463935157ecb050",
"is_error": false,
"tool_kind": "shell"
}pip index versions antimetal 2>&1 | head -5; npm view antimetal 2>&1 | head -10; pip download antimetal -d /tmp/x --no-deps 2>&1 | tail -2
antimetal (0.1.0)
antimetal (0.1.0) Available versions: 0.1.0 [notice] A new release of pip is available: 26.2.1 -> 26.2.2 [notice] To update, run: /opt/freestyle/python/bin/python3 -m pip install --upgrade pip npm error code E404 npm error 404 Not Found - GET https://registry.npmjs.org/antimetal - Not found npm error 404 npm error 404 'antimetal@*' is not in this registry. npm error 404 npm error 404 Note that you can also install from a npm error 404 tarball, folder, http url, or git url. npm error A complete log of this run can be found in: /sandbox/.npm/_logs/2026-10-21T15_33_48_033Z-debug-0.log [notice] A new release of pip is available: 26.2.1 -> 26.2.2 [notice] To update, run: /opt/freestyle/python/bin/python3 -m pip install --upgrade pip
Recorded tool call
{
"type": "tool_call",
"seq": 6,
"ts": "2026-10-21T15:33:46.512Z",
"name": "bash",
"turn": 1,
"input": {
"command": "pip index versions antimetal 2>&1 | head -5; npm view antimetal 2>&1 | head -10; pip download antimetal -d /tmp/x --no-deps 2>&1 | tail -2"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-a93fb33cecee727f",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 8,
"ts": "2026-10-21T15:33:50.585Z",
"turn": 1,
"output": {
"content": [
{
"text": "antimetal (0.1.0)\nAvailable versions: 0.1.0\n\n[notice] A new release of pip is available: 26.2.1 -> 26.2.2\n[notice] To update, run: /opt/freestyle/python/bin/python3 -m pip install --upgrade pip\nnpm error code E404\nnpm error 404 Not Found - GET https://registry.npmjs.org/antimetal - Not found\nnpm error 404\nnpm error 404 'antimetal@*' is not in this registry.\nnpm error 404\nnpm error 404 Note that you can also install from a\nnpm error 404 tarball, folder, http url, or git url.\nnpm error A complete log of this run can be found in: /sandbox/.npm/_logs/2026-10-21T15_33_48_033Z-debug-0.log\n[notice] A new release of pip is available: 26.2.1 -> 26.2.2\n[notice] To update, run: /opt/freestyle/python/bin/python3 -m pip install --upgrade pip\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-a93fb33cecee727f",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
There's a Python package "antimetal" 0.1.0 on PyPI, but is it the real one? Let me verify. Also, I'll check the contents of docs.antimetal.com and the pricing page on the website.
curl -sL --max-time 15 https://pypi.org/pypi/antimetal/json | python3 -c "import json,sys; d=json.load(sys.stdin)['info']; print(d['summary']); print(d['home_page']); print(d.get('author')); print(d['description'][:800])"Ryan Eloff
Ryan Eloff
Recorded tool call
{
"type": "tool_call",
"seq": 11,
"ts": "2026-10-21T15:33:53.517Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 15 https://pypi.org/pypi/antimetal/json | python3 -c \"import json,sys; d=json.load(sys.stdin)['info']; print(d['summary']); print(d['home_page']); print(d.get('author')); print(d['description'][:800])\""
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-8414c850e6c7baf3",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 18,
"ts": "2026-10-21T15:33:53.826Z",
"turn": 1,
"output": {
"content": [
{
"text": "\n\nRyan Eloff\n\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-8414c850e6c7baf3",
"is_error": false,
"tool_kind": "shell"
}curl -sL --max-time 15 https://docs.antimetal.com | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<[^>]+>',' ',t); print(html.unescape(re.sub(r'\s+',' ',t))[:2000])"; echo; curl -sL --max-time 15 -o /dev/null -w "%{http_code}\n" https://docs.antimetal.com/apiAntimetal Overview - Antimetal Docs !function(){var b=""; function a(p){if(p==null)return"/";p=""+p;if(""===p)return"/";return"/"===p.charAt(0)?p:"/"+p} functi
Antimetal Overview - Antimetal Docs !function(){var b=""; function a(p){if(p==null)return"/";p=""+p;if(""===p)return"/";return"/"===p.charAt(0)?p:"/"+p} function u(p){if(p==null)return p;p=""+p;if(!p||p.charAt(p.length-1)==="/")return p.slice(0,-1);return p} function i(p){if(p==null)return p;p=""+p;if(6 (() => { const isIOS = /iP(hone|ad|od)/.test(navigator.userAgent) || (/Macintosh/.test(navigator.userAgent) && navigator.maxTouchPoints > 1); if (!isIOS) return; const apply = () => { for (const meta of document.querySelectorAll('meta[name="viewport"]')) { const content = meta.getAttribute('content') || ''; if (!content.includes('maximum-scale')) { meta.setAttribute('content', content + ', maximum-scale=1'); } } }; apply(); new MutationObserver(apply).observe(document.head, { childList: true, subtree: true, attributes: true, attributeFilter: ['content'], }); })(); !function(){ function read(){try{ var e=performance.getEntriesByType?performance.getEntriesByType("navigation"):[]; var st=(e[0]&&e[0].serverTiming)||[]; var g={}; for(var i=0;i !function(){try{ var w=window;w.mintlify=w.mintlify||{}; var q=w.mintlify.__apiPlaygroundInputsQueue; if(!Array.isArray(q)){q=[];w.mintlify.__apiPlaygroundInputsQueue=q;} w.mintlify.api=w.mintlify.api||{}; w.mintlify.api.playground=w.mintlify.api.playground||{}; if(typeof w.mintlify.api.playground.setServerVariables!=="function"){ w.mintlify.api.playground.setServerVariables=function(v){q.push({type:"set",variables:v});}; } if(typeof w.mintlify.api.playground.clearServerVariables!=="function"){ w.mintlify.api.playground.clearServerVariables=function(){q.push({type:"clear"});}; } }catch(e){}}(); (function(){ if(typeof CSS==="undefined"||!("registerProperty" in CSS))return; if(CSS.supports&&CSS.supports("-webkit-backdrop-filter:none"))return; var n=["--scroll-area-overflow-x-start","--scroll-area-overflow-x-end","--scroll-area-overflow-y-start","--scroll-area-overflow-y-end"]; var d={"syntax":" ","inherits":false,"initialValue":"0px"
404
Recorded tool call
{
"type": "tool_call",
"seq": 13,
"ts": "2026-10-21T15:33:53.517Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 15 https://docs.antimetal.com | python3 -c \"import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<[^>]+>',' ',t); print(html.unescape(re.sub(r'\\s+',' ',t))[:2000])\"; echo; curl -sL --max-time 15 -o /dev/null -w \"%{http_code}\\n\" https://docs.antimetal.com/api"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-abe96fa2ec52fd92",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 19,
"ts": "2026-10-21T15:33:55.469Z",
"turn": 1,
"output": {
"content": [
{
"text": " Antimetal Overview - Antimetal Docs !function(){var b=\"\"; function a(p){if(p==null)return\"/\";p=\"\"+p;if(\"\"===p)return\"/\";return\"/\"===p.charAt(0)?p:\"/\"+p} function u(p){if(p==null)return p;p=\"\"+p;if(!p||p.charAt(p.length-1)===\"/\")return p.slice(0,-1);return p} function i(p){if(p==null)return p;p=\"\"+p;if(6 (() => { const isIOS = /iP(hone|ad|od)/.test(navigator.userAgent) || (/Macintosh/.test(navigator.userAgent) && navigator.maxTouchPoints > 1); if (!isIOS) return; const apply = () => { for (const meta of document.querySelectorAll('meta[name=\"viewport\"]')) { const content = meta.getAttribute('content') || ''; if (!content.includes('maximum-scale')) { meta.setAttribute('content', content + ', maximum-scale=1'); } } }; apply(); new MutationObserver(apply).observe(document.head, { childList: true, subtree: true, attributes: true, attributeFilter: ['content'], }); })(); !function(){ function read(){try{ var e=performance.getEntriesByType?performance.getEntriesByType(\"navigation\"):[]; var st=(e[0]&&e[0].serverTiming)||[]; var g={}; for(var i=0;i !function(){try{ var w=window;w.mintlify=w.mintlify||{}; var q=w.mintlify.__apiPlaygroundInputsQueue; if(!Array.isArray(q)){q=[];w.mintlify.__apiPlaygroundInputsQueue=q;} w.mintlify.api=w.mintlify.api||{}; w.mintlify.api.playground=w.mintlify.api.playground||{}; if(typeof w.mintlify.api.playground.setServerVariables!==\"function\"){ w.mintlify.api.playground.setServerVariables=function(v){q.push({type:\"set\",variables:v});}; } if(typeof w.mintlify.api.playground.clearServerVariables!==\"function\"){ w.mintlify.api.playground.clearServerVariables=function(){q.push({type:\"clear\"});}; } }catch(e){}}(); (function(){ if(typeof CSS===\"undefined\"||!(\"registerProperty\" in CSS))return; if(CSS.supports&&CSS.supports(\"-webkit-backdrop-filter:none\"))return; var n=[\"--scroll-area-overflow-x-start\",\"--scroll-area-overflow-x-end\",\"--scroll-area-overflow-y-start\",\"--scroll-area-overflow-y-end\"]; var d={\"syntax\":\" \",\"inherits\":false,\"initialValue\":\"0px\"\n\n404\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-abe96fa2ec52fd92",
"is_error": false,
"tool_kind": "shell"
}python3 - <<'EOF'
import re,html
t=open('/tmp/am.html').read()
txt=re.sub(r'<script.*?</script>','',t,flags=re.S)
txt=re.sub(r'<[^>]+>',' ',txt)
txt=html.unescape(re.sub(r'\s+',' ',txt))
print(txt[:3000])
EOFAntimetal Antimetal Blog Careers Sign In Book a Demo Blog Careers Sign In Book a Demo Company Careers Blog Resources Docs Guides Glossary Integrations Complian
Antimetal Antimetal Blog Careers Sign In Book a Demo Blog Careers Sign In Book a Demo Company Careers Blog Resources Docs Guides Glossary Integrations Compliance Trust Center Terms Privacy All Systems Normal Built in NYC The Autonomous System for Production SOC 2, GDPR, and HIPAA compliant. Production that runs itself. P r o d u c t i o n t h a t r u n s i t s e l f . The autonomous system for production that diagnoses, fixes, and prevents issues across your environment. Book a Demo Trusted by engineering teams at Antimetal automates production engineering so your team can focus on building. A n t i m e t a l a u t o m a t e s p r o d u c t i o n e n g i n e e r i n g s o y o u r t e a m c a n f o c u s o n b u i l d i n g . Models your environment Antimetal builds a World Model from your code, infrastructure, and observability data, refining it with every change, investigation, and team decision. Code Infrastructure Observability Connecting your system Mapping services, dependencies, and behavior Building your World Model Continuous learning Triages incoming signals Antimetal ingests tickets, alerts, deployments, and other signals, grouping related events and filtering out noise. Time Source Event Linked finding 22m Error budget burning at 1.8× on checkout-svc 6 related events clustered · 6 sources ISS-2 22m Medic Flagged error-budget burn on checkout-svc checkout-svc · Agent finding Unlinked 23m Datadog [P1] checkout-svc · error budget burn rate > 1.5× checkout-svc · Monitor triggered Unlinked 24m Datadog search-api · disk usage monitor flapping search-api · Auto-resolved 3× Unlinked 26m Guardian Connection pool saturation on checkout-svc checkout-svc → prod-db Unlinked 30m AWS RDS read replica prod-db-ro restarted prod-db · us-east-1 Unlinked 34m Lookout orders-worker at 82% of scaling headroom orders-worker · Capacity forecast Unlinked 41m Kubernetes checkout-svc scaled 8 → 6 replicas checkout-svc · Deployment Unlinked 42m GitHub Deploy v3.2.1 rolled out to production checkout-svc · PR #3761 Unlinked Shows what needs attention Antimetal distills those signals into a prioritized list of Issues to address and Improvements to make your system healthier. Your priorities Ranked by impact & urgency Evaluating new checkout activity… 0 1 0 2 0 3 ISS-2 Issue Investigating Checkout errors after replica rollout New checkout errors IMP-16 Improvement Plan ahead Raise checkout’s scaling ceiling Capacity risk ahead of next week’s peak IMP-4 Improvement Improve Add missing latency monitoring Close a blind spot in search-api Fixes and verifies Antimetal generates code and configuration fixes for review, then verifies approved changes in production to confirm the problem is resolved and the fix holds. Fix & verify ISS-2 · checkout-svc Recycle stale database connections PR #3775 +1 −1 services/checkout/database.ts + maxLifetimeSeconds: 60 Approved Checks passed Deployed Production verification 1.4s p95 latency Before fix After rollout Baseline Fix ready for y
Recorded tool call
{
"type": "tool_call",
"seq": 16,
"ts": "2026-10-21T15:33:53.517Z",
"name": "bash",
"turn": 1,
"input": {
"command": "python3 - <<'EOF'\nimport re,html\nt=open('/tmp/am.html').read()\ntxt=re.sub(r'<script.*?</script>','',t,flags=re.S)\ntxt=re.sub(r'<[^>]+>',' ',txt)\ntxt=html.unescape(re.sub(r'\\s+',' ',txt))\nprint(txt[:3000])\nEOF"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-8ba96016d8e5e56e",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 17,
"ts": "2026-10-21T15:33:53.517Z",
"turn": 1,
"output": {
"content": [
{
"text": " Antimetal Antimetal Blog Careers Sign In Book a Demo Blog Careers Sign In Book a Demo Company Careers Blog Resources Docs Guides Glossary Integrations Compliance Trust Center Terms Privacy All Systems Normal Built in NYC The Autonomous System for Production SOC 2, GDPR, and HIPAA compliant. Production that runs itself. P r o d u c t i o n t h a t r u n s i t s e l f . The autonomous system for production that diagnoses, fixes, and prevents issues across your environment. Book a Demo Trusted by engineering teams at Antimetal automates production engineering so your team can focus on building. A n t i m e t a l a u t o m a t e s p r o d u c t i o n e n g i n e e r i n g s o y o u r t e a m c a n f o c u s o n b u i l d i n g . Models your environment Antimetal builds a World Model from your code, infrastructure, and observability data, refining it with every change, investigation, and team decision. Code Infrastructure Observability Connecting your system Mapping services, dependencies, and behavior Building your World Model Continuous learning Triages incoming signals Antimetal ingests tickets, alerts, deployments, and other signals, grouping related events and filtering out noise. Time Source Event Linked finding 22m Error budget burning at 1.8× on checkout-svc 6 related events clustered · 6 sources ISS-2 22m Medic Flagged error-budget burn on checkout-svc checkout-svc · Agent finding Unlinked 23m Datadog [P1] checkout-svc · error budget burn rate > 1.5× checkout-svc · Monitor triggered Unlinked 24m Datadog search-api · disk usage monitor flapping search-api · Auto-resolved 3× Unlinked 26m Guardian Connection pool saturation on checkout-svc checkout-svc → prod-db Unlinked 30m AWS RDS read replica prod-db-ro restarted prod-db · us-east-1 Unlinked 34m Lookout orders-worker at 82% of scaling headroom orders-worker · Capacity forecast Unlinked 41m Kubernetes checkout-svc scaled 8 → 6 replicas checkout-svc · Deployment Unlinked 42m GitHub Deploy v3.2.1 rolled out to production checkout-svc · PR #3761 Unlinked Shows what needs attention Antimetal distills those signals into a prioritized list of Issues to address and Improvements to make your system healthier. Your priorities Ranked by impact & urgency Evaluating new checkout activity… 0 1 0 2 0 3 ISS-2 Issue Investigating Checkout errors after replica rollout New checkout errors IMP-16 Improvement Plan ahead Raise checkout’s scaling ceiling Capacity risk ahead of next week’s peak IMP-4 Improvement Improve Add missing latency monitoring Close a blind spot in search-api Fixes and verifies Antimetal generates code and configuration fixes for review, then verifies approved changes in production to confirm the problem is resolved and the fix holds. Fix & verify ISS-2 · checkout-svc Recycle stale database connections PR #3775 +1 −1 services/checkout/database.ts + maxLifetimeSeconds: 60 Approved Checks passed Deployed Production verification 1.4s p95 latency Before fix After rollout Baseline Fix ready for y\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-8ba96016d8e5e56e",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Interesting — Antimetal has pivoted: it used to be about AWS cost optimization, but now it's "an autonomous system for production" — production engineering automation. There's docs.antimetal.com (Mintlify docs). The PyPI "antimetal" package by Ryan Eloff is unrelated (Ryan Eloff is the author of kappa). Let me check the docs for the presence of an API/SDK, quickstart, and pricing page.
The site's PyPI package is unrelated (author Ryan Eloff, unrelated to antimetal.com). To check whether there's a developer workflow, let's investigate the actual Antimetal documentation and pricing pages.
curl -sL --max-time 15 https://docs.antimetal.com/llms.txt 2>/dev/null | head -80; echo "==="; curl -sL --max-time 15 https://docs.antimetal.com/mint.json 2>/dev/null | head -100
# Antimetal Docs
# Antimetal Docs
- [Antimetal Overview](https://docs.antimetal.com/index.md): Learn how to set up and use Antimetal
- [Quick Start](https://docs.antimetal.com/quick-start.md): Get up and running with Antimetal
- [MCP](https://docs.antimetal.com/connect.md): Connect to Antimetal's MCP server from your AI tools
- [Integrations Overview](https://docs.antimetal.com/integrations/overview.md): Connect Antimetal to your existing tools and workflows
- [Datadog](https://docs.antimetal.com/integrations/datadog.md): Generate API and application keys in Datadog for Antimetal
- [Grafana](https://docs.antimetal.com/integrations/grafana.md): Connect Grafana Cloud or a self-hosted Grafana instance to Antimetal
- [Honeycomb](https://docs.antimetal.com/integrations/honeycomb.md): Create a Honeycomb Management API key for Antimetal
- [Sentry](https://docs.antimetal.com/integrations/sentry.md): Set up an internal integration in Sentry for Antimetal
- [Victoria Logs](https://docs.antimetal.com/integrations/victoria-logs.md): Connect your VictoriaLogs instance to Antimetal
- [Victoria Metrics](https://docs.antimetal.com/integrations/victoria-metrics.md): Connect VictoriaMetrics (self-hosted or Cloud) to Antimetal
- [Self-Hosted Observability](https://docs.antimetal.com/integrations/self-hosted-observability.md): Connect Antimetal to observability tools you host yourself, such as Grafana, Victoria Logs, Victoria Metrics, Prometheus, and Pyroscope
- [CloudWatch](https://docs.antimetal.com/integrations/cloudwatch.md): Set up an IAM Role with CloudWatch access for Antimetal
- [GCP](https://docs.antimetal.com/integrations/gcp.md): Create a GCP service account for Antimetal monitoring
- [Azure](https://docs.antimetal.com/integrations/azure.md): Create an Entra service principal for Antimetal monitoring
- [Vercel](https://docs.antimetal.com/integrations/vercel.md): Connect your Vercel account to Antimetal for deployment monitoring and runtime log analysis
- [PagerDuty](https://docs.antimetal.com/integrations/pagerduty.md): Connect PagerDuty to Antimetal
- [Incident.io](https://docs.antimetal.com/integrations/incident-io.md): Create an API key in Incident.io for Antimetal
- [GitHub](https://docs.antimetal.com/integrations/github.md): Connect your GitHub repositories to Antimetal
- [Azure DevOps](https://docs.antimetal.com/integrations/azure-devops.md): Create a read-only Personal Access Token for Antimetal
- [Slack](https://docs.antimetal.com/integrations/slack.md): Investigate alerts and get weekly digests, directly in Slack
- [Search](https://docs.antimetal.com/product/search.md): Ask anything about your infrastructure, services, and systems
- [Issue Lifecycle](https://docs.antimetal.com/product/issue-lifecycle.md): How issues move from alert to resolution in Antimetal
- [Fixes](https://docs.antimetal.com/product/fixes.md): Review a proposed fix, run it yourself, or open a PR straight from Antimetal
- [Skills](https://docs.antimetal.com/product/skills.md): Use Antimetal directly from your AI coding tools
- [Security and Compliance](https://docs.antimetal.com/admin/security.md): How Antimetal handles security, privacy, and access
- [Fetch issues for an organization](https://docs.antimetal.com/api-reference/issues/fetch-issues-for-an-organization.md): Returns a paginated list of issues for the authenticated organization
- [Create a new issue](https://docs.antimetal.com/api-reference/issues/create-a-new-issue.md): Creates a new issue and optionally starts an automated investigation. The issue is created from the provided details, with a seed generated internally. Investigation runs asynchronously - poll GET /issues/{id} to check status.
- [Fetch issue by number](https://docs.antimetal.com/api-reference/issues/fetch-issue-by-number.md): Lightweight endpoint to retrieve basic issue information by issue number
- [Fetch an issue by ID (UUID)](https://docs.antimetal.com/api-reference/issues/fetch-an-issue-by-id-uuid.md): Retrieves detailed information about a specific issue by its ID (UUID)
- [Delete an issue](https://docs.antimetal.com/api-reference/issues/delete-an-issue.md): Permanently deletes an issue and all associated data
- [Update issue status by ID (UUID)](https://docs.antimetal.com/api-reference/issues/update-issue-status-by-id-uuid.md): Updates the status of an existing issue by its ID (UUID)
- [Fetch investigation results by ID (UUID)](https://docs.antimetal.com/api-reference/issues/fetch-investigation-results-by-id-uuid.md): Retrieves detailed investigation results including root cause analysis and remediation steps
- [Retrieve artifacts by IDs](https://docs.antimetal.com/api-reference/artifacts/retrieve-artifacts-by-ids.md): Fetches multiple evidential artifacts by their IDs. Supports up to 100 IDs per request.
- [Ask Antimetal's AI agent a question](https://docs.antimetal.com/api-reference/query/ask-antimetals-ai-agent-a-question.md): Sends a question to Antimetal's AI agent and returns a natural language answer. Pass the returned conversation_id in subsequent requests to continue the conversation. Set stream: true (and Accept: text/event-stream) to receive a Server-Sent Events stream.
## OpenAPI Specs
- [openapi.mintlify](/assets/openapi.mintlify.json)
This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.===
Recorded tool call
{
"type": "tool_call",
"seq": 22,
"ts": "2026-10-21T15:34:00.206Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 15 https://docs.antimetal.com/llms.txt 2>/dev/null | head -80; echo \"===\"; curl -sL --max-time 15 https://docs.antimetal.com/mint.json 2>/dev/null | head -100"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-a98e5b791334c0f7",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 27,
"ts": "2026-10-21T15:34:01.976Z",
"turn": 1,
"output": {
"content": [
{
"text": "# Antimetal Docs\n\n- [Antimetal Overview](https://docs.antimetal.com/index.md): Learn how to set up and use Antimetal\n- [Quick Start](https://docs.antimetal.com/quick-start.md): Get up and running with Antimetal\n- [MCP](https://docs.antimetal.com/connect.md): Connect to Antimetal's MCP server from your AI tools\n- [Integrations Overview](https://docs.antimetal.com/integrations/overview.md): Connect Antimetal to your existing tools and workflows\n- [Datadog](https://docs.antimetal.com/integrations/datadog.md): Generate API and application keys in Datadog for Antimetal\n- [Grafana](https://docs.antimetal.com/integrations/grafana.md): Connect Grafana Cloud or a self-hosted Grafana instance to Antimetal\n- [Honeycomb](https://docs.antimetal.com/integrations/honeycomb.md): Create a Honeycomb Management API key for Antimetal\n- [Sentry](https://docs.antimetal.com/integrations/sentry.md): Set up an internal integration in Sentry for Antimetal\n- [Victoria Logs](https://docs.antimetal.com/integrations/victoria-logs.md): Connect your VictoriaLogs instance to Antimetal\n- [Victoria Metrics](https://docs.antimetal.com/integrations/victoria-metrics.md): Connect VictoriaMetrics (self-hosted or Cloud) to Antimetal\n- [Self-Hosted Observability](https://docs.antimetal.com/integrations/self-hosted-observability.md): Connect Antimetal to observability tools you host yourself, such as Grafana, Victoria Logs, Victoria Metrics, Prometheus, and Pyroscope\n- [CloudWatch](https://docs.antimetal.com/integrations/cloudwatch.md): Set up an IAM Role with CloudWatch access for Antimetal\n- [GCP](https://docs.antimetal.com/integrations/gcp.md): Create a GCP service account for Antimetal monitoring\n- [Azure](https://docs.antimetal.com/integrations/azure.md): Create an Entra service principal for Antimetal monitoring\n- [Vercel](https://docs.antimetal.com/integrations/vercel.md): Connect your Vercel account to Antimetal for deployment monitoring and runtime log analysis\n- [PagerDuty](https://docs.antimetal.com/integrations/pagerduty.md): Connect PagerDuty to Antimetal\n- [Incident.io](https://docs.antimetal.com/integrations/incident-io.md): Create an API key in Incident.io for Antimetal\n- [GitHub](https://docs.antimetal.com/integrations/github.md): Connect your GitHub repositories to Antimetal\n- [Azure DevOps](https://docs.antimetal.com/integrations/azure-devops.md): Create a read-only Personal Access Token for Antimetal\n- [Slack](https://docs.antimetal.com/integrations/slack.md): Investigate alerts and get weekly digests, directly in Slack\n- [Search](https://docs.antimetal.com/product/search.md): Ask anything about your infrastructure, services, and systems\n- [Issue Lifecycle](https://docs.antimetal.com/product/issue-lifecycle.md): How issues move from alert to resolution in Antimetal\n- [Fixes](https://docs.antimetal.com/product/fixes.md): Review a proposed fix, run it yourself, or open a PR straight from Antimetal\n- [Skills](https://docs.antimetal.com/product/skills.md): Use Antimetal directly from your AI coding tools\n- [Security and Compliance](https://docs.antimetal.com/admin/security.md): How Antimetal handles security, privacy, and access\n- [Fetch issues for an organization](https://docs.antimetal.com/api-reference/issues/fetch-issues-for-an-organization.md): Returns a paginated list of issues for the authenticated organization\n- [Create a new issue](https://docs.antimetal.com/api-reference/issues/create-a-new-issue.md): Creates a new issue and optionally starts an automated investigation. The issue is created from the provided details, with a seed generated internally. Investigation runs asynchronously - poll GET /issues/{id} to check status.\n- [Fetch issue by number](https://docs.antimetal.com/api-reference/issues/fetch-issue-by-number.md): Lightweight endpoint to retrieve basic issue information by issue number\n- [Fetch an issue by ID (UUID)](https://docs.antimetal.com/api-reference/issues/fetch-an-issue-by-id-uuid.md): Retrieves detailed information about a specific issue by its ID (UUID)\n- [Delete an issue](https://docs.antimetal.com/api-reference/issues/delete-an-issue.md): Permanently deletes an issue and all associated data\n- [Update issue status by ID (UUID)](https://docs.antimetal.com/api-reference/issues/update-issue-status-by-id-uuid.md): Updates the status of an existing issue by its ID (UUID)\n- [Fetch investigation results by ID (UUID)](https://docs.antimetal.com/api-reference/issues/fetch-investigation-results-by-id-uuid.md): Retrieves detailed investigation results including root cause analysis and remediation steps\n- [Retrieve artifacts by IDs](https://docs.antimetal.com/api-reference/artifacts/retrieve-artifacts-by-ids.md): Fetches multiple evidential artifacts by their IDs. Supports up to 100 IDs per request.\n- [Ask Antimetal's AI agent a question](https://docs.antimetal.com/api-reference/query/ask-antimetals-ai-agent-a-question.md): Sends a question to Antimetal's AI agent and returns a natural language answer. Pass the returned conversation_id in subsequent requests to continue the conversation. Set stream: true (and Accept: text/event-stream) to receive a Server-Sent Events stream.\n\n## OpenAPI Specs\n\n- [openapi.mintlify](/assets/openapi.mintlify.json)\n\n\nThis documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.===\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-a98e5b791334c0f7",
"is_error": false,
"tool_kind": "shell"
}curl -sL --max-time 15 -o /dev/null -w "%{http_code} %{url_effective}\n" https://www.antimetal.com/pricing; curl -sL --max-time 15 https://www.antimetal.com/pricing | python3 -c "
import re,html,sys
t=sys.stdin.read()
t=re.sub(r'<script.*?</script>','',t,flags=re.S)
t=re.sub(r'<[^>]+>',' ',t)
print(html.unescape(re.sub(r'\s+',' ',t))[:2500])"404 https://antimetal.com/pricing
404 https://antimetal.com/pricing Antimetal Antimetal Blog Careers Sign In Book a Demo Blog Careers Sign In Book a Demo Company Careers Blog Resources Docs Guides Glossary Integrations Compliance Trust Center Terms Privacy All Systems Normal Built in NYC The Autonomous System for Production SOC 2, GDPR, and HIPAA compliant. Page not found The page you are looking for does not exist. Back home
Recorded tool call
{
"type": "tool_call",
"seq": 25,
"ts": "2026-10-21T15:34:00.206Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 15 -o /dev/null -w \"%{http_code} %{url_effective}\\n\" https://www.antimetal.com/pricing; curl -sL --max-time 15 https://www.antimetal.com/pricing | python3 -c \"\nimport re,html,sys\nt=sys.stdin.read()\nt=re.sub(r'<script.*?</script>','',t,flags=re.S)\nt=re.sub(r'<[^>]+>',' ',t)\nprint(html.unescape(re.sub(r'\\s+',' ',t))[:2500])\""
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-bf9c0a490f77b863",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 28,
"ts": "2026-10-21T15:34:02.299Z",
"turn": 1,
"output": {
"content": [
{
"text": "404 https://antimetal.com/pricing\n Antimetal Antimetal Blog Careers Sign In Book a Demo Blog Careers Sign In Book a Demo Company Careers Blog Resources Docs Guides Glossary Integrations Compliance Trust Center Terms Privacy All Systems Normal Built in NYC The Autonomous System for Production SOC 2, GDPR, and HIPAA compliant. Page not found The page you are looking for does not exist. Back home \n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-bf9c0a490f77b863",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Antimetal has a REST API (api-reference), but I don't see a public SDK. There's no public pricing page — instead it's "Book a Demo." To build an example, let me check the quick-start and API reference — though I'll probably need an account/API key, and I don't have one on hand. Per the user's instructions: "Use the hosted product via its SDK or API," "If this product has no developer workflow you can work with, state that frankly and stop."
There is an API workflow (REST API with endpoints). But it requires an authenticated organization — it needs signing up, and probably going through a demo / sales-led process. Let me quickly skim the quick-start and API authentication docs to confirm whether I can self-serve obtain an API key.
curl -sL --max-time 15 https://docs.antimetal.com/quick-start.md | head -80
> ## Documentation Index
> ## Documentation Index > Fetch the complete documentation index at: https://docs.antimetal.com/llms.txt > Use this file to discover all available pages before exploring further. # Quick Start > Get up and running with Antimetal ## Prerequisites * You have connected all your [integrations](/integrations/overview). ## Search with Antimetal You can ask Antimetal broad questions related to your infrastructure and architecture. Antimetal will leverage the rich understanding it has about your system to give you an answer.  ## Investigate an Issue In order for a new issue to show up on the issues page, kick off an investigation against an alert in [Slack](/integrations/slack). ### Live View As the investigation is on-going, you will be presented with Antimetal's live chain of thought, giving you clear insight into its reasoning.  The inputs and outputs to all tool calls are directly accessible, enabling you to understand exactly what data Antimetal is pulling in.  ### Answers Once the investigation is complete, you will be directed to the Answers tab, where you will be given clear insight into what happened, the root cause (with an Antimetal confidence score) and a Causal Graph, to highlight the reasoning pathway that Antimetal took to arrive at its conclusion.  Antimetal also presents findings, which directly support its root cause diagnosis. Once again, these findings are completely auditable. They represent the data deemed most relevant to the root cause, and is only a small portion of the data that Antimetal looked over.  ### Fixes The fixes tab contains remediations proposed by Antimetal to address the root cause.  Each fix contains a detailed explanation, as well the ability to copy it as a prompt or open it in your IDE.  ### Chat If you want to ask a question about the report, or add more context, you can do so through the chat experience. You can also choose add more context for Antimetal to use to regenerate the investigation.  This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.
Recorded tool call
{
"type": "tool_call",
"seq": 31,
"ts": "2026-10-21T15:34:04.824Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 15 https://docs.antimetal.com/quick-start.md | head -80"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-ae7a1c20cdba874b",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 36,
"ts": "2026-10-21T15:34:05.677Z",
"turn": 1,
"output": {
"content": [
{
"text": "> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.antimetal.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Quick Start\n\n> Get up and running with Antimetal\n\n## Prerequisites\n\n* You have connected all your [integrations](/integrations/overview).\n\n## Search with Antimetal\n\nYou can ask Antimetal broad questions related to your infrastructure and architecture. Antimetal will leverage the rich understanding it has about your system to give you an answer.\n\n\n\n## Investigate an Issue\n\nIn order for a new issue to show up on the issues page, kick off an investigation against an alert in [Slack](/integrations/slack).\n\n### Live View\n\nAs the investigation is on-going, you will be presented with Antimetal's live chain of thought, giving you clear insight into its reasoning.\n\n\n\nThe inputs and outputs to all tool calls are directly accessible, enabling you to understand exactly what data Antimetal is pulling in.\n\n\n\n### Answers\n\nOnce the investigation is complete, you will be directed to the Answers tab, where you will be given clear insight into what happened, the root cause (with an Antimetal confidence score) and a Causal Graph, to highlight the reasoning pathway that Antimetal took to arrive at its conclusion.\n\n\n\nAntimetal also presents findings, which directly support its root cause diagnosis. Once again, these findings are completely auditable. They represent the data deemed most relevant to the root cause, and is only a small portion of the data that Antimetal looked over.\n\n\n\n### Fixes\n\nThe fixes tab contains remediations proposed by Antimetal to address the root cause.\n\n\n\nEach fix contains a detailed explanation, as well the ability to copy it as a prompt or open it in your IDE.\n\n\n\n### Chat\n\nIf you want to ask a question about the report, or add more context, you can do so through the chat experience. You can also choose add more context for Antimetal to use to regenerate the investigation.\n\n\n\n\nThis documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-ae7a1c20cdba874b",
"is_error": false,
"tool_kind": "shell"
}curl -sL --max-time 15 https://docs.antimetal.com/api-reference/issues/fetch-issues-for-an-organization.md | head -100
> ## Documentation Index
> ## Documentation Index
> Fetch the complete documentation index at: https://docs.antimetal.com/llms.txt
> Use this file to discover all available pages before exploring further.
# Fetch issues for an organization
> Returns a paginated list of issues for the authenticated organization
## OpenAPI
````yaml /assets/openapi.mintlify.json get /issues
openapi: 3.0.0
info:
title: Antimetal External API
description: >-
Public-facing API for external integrations with Antimetal. Provides
programmatic access to issue investigation, results, artifacts, and chat
functionality.
version: '2026-03-17'
contact: {}
servers:
- url: https://bff.antimetal.com/api/v2
description: Production API
- url: https://bff.dev.antimetal.com/api/v2
description: Dev API
security:
- bearer: []
tags: []
paths:
/issues:
get:
tags:
- Issues
summary: Fetch issues for an organization
description: Returns a paginated list of issues for the authenticated organization
operationId: listIssues
parameters:
- $ref: '#/components/parameters/AntimetalVersion'
- name: limit
required: false
in: query
description: Number of items to return (1-100)
schema:
minimum: 1
maximum: 100
default: 10
type: integer
- name: startingAfter
required: false
in: query
description: Cursor for forward pagination (ID/UUID to start after)
schema:
type: string
- name: endingBefore
required: false
in: query
description: Cursor for backward pagination (ID/UUID to end before)
schema:
type: string
- name: status
required: false
in: query
description: Filter by issue status
schema:
type: string
enum:
- investigating
- ready_to_fix
- resolved
- muted
- name: environment
required: false
in: query
description: Filter by environment (exact match)
schema:
minLength: 1
type: string
- name: search
required: false
in: query
description: >-
Search issues by title or description (case-insensitive substring
match)
schema:
minLength: 1
type: string
responses:
'200':
description: Paginated list of issues
content:
application/json:
schema:
type: object
properties:
object:
type: string
enum:
- list
Recorded tool call
{
"type": "tool_call",
"seq": 33,
"ts": "2026-10-21T15:34:04.824Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 15 https://docs.antimetal.com/api-reference/issues/fetch-issues-for-an-organization.md | head -100"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-b764a66ad7538054",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 35,
"ts": "2026-10-21T15:34:05.677Z",
"turn": 1,
"output": {
"content": [
{
"text": "> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.antimetal.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Fetch issues for an organization\n\n> Returns a paginated list of issues for the authenticated organization\n\n\n\n## OpenAPI\n\n````yaml /assets/openapi.mintlify.json get /issues\nopenapi: 3.0.0\ninfo:\n title: Antimetal External API\n description: >-\n Public-facing API for external integrations with Antimetal. Provides\n programmatic access to issue investigation, results, artifacts, and chat\n functionality.\n version: '2026-03-17'\n contact: {}\nservers:\n - url: https://bff.antimetal.com/api/v2\n description: Production API\n - url: https://bff.dev.antimetal.com/api/v2\n description: Dev API\nsecurity:\n - bearer: []\ntags: []\npaths:\n /issues:\n get:\n tags:\n - Issues\n summary: Fetch issues for an organization\n description: Returns a paginated list of issues for the authenticated organization\n operationId: listIssues\n parameters:\n - $ref: '#/components/parameters/AntimetalVersion'\n - name: limit\n required: false\n in: query\n description: Number of items to return (1-100)\n schema:\n minimum: 1\n maximum: 100\n default: 10\n type: integer\n - name: startingAfter\n required: false\n in: query\n description: Cursor for forward pagination (ID/UUID to start after)\n schema:\n type: string\n - name: endingBefore\n required: false\n in: query\n description: Cursor for backward pagination (ID/UUID to end before)\n schema:\n type: string\n - name: status\n required: false\n in: query\n description: Filter by issue status\n schema:\n type: string\n enum:\n - investigating\n - ready_to_fix\n - resolved\n - muted\n - name: environment\n required: false\n in: query\n description: Filter by environment (exact match)\n schema:\n minLength: 1\n type: string\n - name: search\n required: false\n in: query\n description: >-\n Search issues by title or description (case-insensitive substring\n match)\n schema:\n minLength: 1\n type: string\n responses:\n '200':\n description: Paginated list of issues\n content:\n application/json:\n schema:\n type: object\n properties:\n object:\n type: string\n enum:\n - list\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-b764a66ad7538054",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Antimetal has a public REST API with bearer token authentication (https://bff.antimetal.com/api/v2). However, there's no self-service signup, only "Book a Demo." API tokens require an account. Pricing: no public pricing page. Historically, Antimetal charged a percentage of savings (back when they were doing AWS cost optimization). Currently it's sales-led, and pricing isn't publicly disclosed.
Can I build a "simple example"? I can write a sample script against the REST API using an environment variable for the API token, but I can't execute it without credentials. Does this fall under "an actionable developer workflow"? An API exists, and I can write sample client code, but without an account (sales-led onboarding, no self-serve signup), it's impossible to execute against the hosted product. The user stated, "Use the hosted product through its SDK or API," and also said "Let me know if you get stuck."
Following the instructions, the honest approach: a documented REST API does indeed exist, so I can build a sample client script, but live calls will be blocked at credentials (no self-serve signup, demo-only). First, quickly check whether a signup page exists, then write a small sample, and confirm that unauthenticated calls return 401 (a simple curl, not long-running).
Antimetal has a public REST API (https://bff.antimetal.com/api/v2, Bearer authentication). Let me check whether there's self-serve signup and how the API responds without credentials.
curl -s --max-time 15 -o /dev/null -w "signup: %{http_code}\n" https://app.antimetal.com/signup; curl -s --max-time 15 -o /dev/null -w "app: %{http_code}\n" https://app.antimetal.com; curl -s --max-time 15 -w "\napi: %{http_code}\n" "https://bff.antimetal.com/api/v2/issues?limit=1" -H "Antimetal-Version: 2026-03-17"signup: 404
signup: 404
app: 200
{"message":"Authentication required","error":"Unauthorized","statusCode":401}
api: 401
Recorded tool call
{
"type": "tool_call",
"seq": 39,
"ts": "2026-10-21T15:34:09.598Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -s --max-time 15 -o /dev/null -w \"signup: %{http_code}\\n\" https://app.antimetal.com/signup; curl -s --max-time 15 -o /dev/null -w \"app: %{http_code}\\n\" https://app.antimetal.com; curl -s --max-time 15 -w \"\\napi: %{http_code}\\n\" \"https://bff.antimetal.com/api/v2/issues?limit=1\" -H \"Antimetal-Version: 2026-03-17\""
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-9bf692c4079df830",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 43,
"ts": "2026-10-21T15:34:10.781Z",
"turn": 1,
"output": {
"content": [
{
"text": "signup: 404\napp: 200\n{\"message\":\"Authentication required\",\"error\":\"Unauthorized\",\"statusCode\":401}\napi: 401\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-9bf692c4079df830",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The API exists and is responding (401 without a token, as expected). There's no self-serve signup — onboarding is sales-led via "Book a Demo". So you can build examples against the API, but they can't actually be run end-to-end without an account token. Does this fall under "blocked"? The user said "use the hosted product via its SDK or API" — you can write sample code, but live execution requires a demo-gated account. Write a minimal example (Python script + README), verify it fails cleanly with a 401, and communicate clearly: the code example is built, but end-to-end execution is blocked because API tokens are only issued via sales/demo onboarding. Also cover pricing (non-public; sales-led) and manageability.
Actually, let me reconsider the instruction: "If this product doesn't have an actionable developer workflow, say so frankly and stop." There IS a documented public REST API — that's an actionable developer workflow. It's just that credentials are gated. Build a lightweight example, note the credentials blocker. This satisfies "let me know if you get blocked."
Let me check auth/security in the docs to see how to obtain an API token.
The API is up and responding (401 without a token, as expected). Let me check how tokens are issued, then I'll build the sample.
curl -sL --max-time 15 https://docs.antimetal.com/index.md | head -60; echo ===; curl -sL --max-time 15 https://docs.antimetal.com/admin/security.md | grep -i -A3 -B3 "api\|token" | head -40
> ## Documentation Index
> ## Documentation Index > Fetch the complete documentation index at: https://docs.antimetal.com/llms.txt > Use this file to discover all available pages before exploring further. # Antimetal Overview > Learn how to set up and use Antimetal Antimetal handles everything that happens after you deploy. It investigates, fixes, and prevents issues by connecting your cloud platforms, observability tools, and code. * **Diagnose** - When an alert fires, Antimetal pulls together data from your logs, metrics, traces, code, and incident history to identify the root cause. * **Fix** - Antimetal generates production-ready fixes tied to evidence, so your team can review, validate, and ship. * **Prevent** - Antimetal surfaces blind spots and inefficiencies before they become incidents. ## Get Started > **[Set Up Integrations](/integrations/overview)** > > Connect your monitoring, observability, and infrastructure tools to Antimetal. > **[Issue Lifecycle](/product/issue-lifecycle)** > > How issues move from alert to root cause to resolution. > **[MCP](/connect)** > > Connect to Antimetal from Claude Code, Cursor, VS Code, and other AI tools. > **[Security and Compliance](/admin/security)** > > SOC 2 Type II certified. How we handle security, privacy, and data access. This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.=== > **AI providers and model usage** > > Antimetal uses third-party AI APIs from Anthropic, OpenAI, Google, and TypeSafe AI. Anthropic, OpenAI, and Google are configured with no-data-retention policies, and no provider is permitted to train on customer data. Customer data is never used to train shared or generalized models. Each customer's data is handled in a segregated environment with multi-tenant isolation controls. Our current list of subprocessors is at [trust.antimetal.com/subprocessors](https://trust.antimetal.com/subprocessors). > **AI in the product** > -- > **[Datadog](/integrations/datadog#permissions-and-access)** > > Read-only API and Application keys > **[Grafana](/integrations/grafana#permissions-and-access)** > > Read-only service account or access policy token > **[Sentry](/integrations/sentry#permissions-and-access)** > > Read-only internal integration token > **[PagerDuty](/integrations/pagerduty#permissions-and-access)** > > Read-only User API Token > **[Incident.io](/integrations/incident-io#permissions-and-access)** > > Read-only API key ## Best Practices -- > **Manage credentials securely** > > Use the [Antimetal dashboard](https://overlook.antimetal.com) to store integration credentials. Do not share API keys over Slack or email. > **Use least-privilege access** >
Recorded tool call
{
"type": "tool_call",
"seq": 46,
"ts": "2026-10-21T15:34:14.650Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 15 https://docs.antimetal.com/index.md | head -60; echo ===; curl -sL --max-time 15 https://docs.antimetal.com/admin/security.md | grep -i -A3 -B3 \"api\\|token\" | head -40"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-8987971db20808d7",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 49,
"ts": "2026-10-21T15:34:16.150Z",
"turn": 1,
"output": {
"content": [
{
"text": "> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.antimetal.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Antimetal Overview\n\n> Learn how to set up and use Antimetal\n\nAntimetal handles everything that happens after you deploy. It investigates, fixes, and prevents issues by connecting your cloud platforms, observability tools, and code.\n\n* **Diagnose** - When an alert fires, Antimetal pulls together data from your logs, metrics, traces, code, and incident history to identify the root cause.\n* **Fix** - Antimetal generates production-ready fixes tied to evidence, so your team can review, validate, and ship.\n* **Prevent** - Antimetal surfaces blind spots and inefficiencies before they become incidents.\n\n## Get Started\n\n> **[Set Up Integrations](/integrations/overview)**\n>\n> Connect your monitoring, observability, and infrastructure tools to Antimetal.\n\n> **[Issue Lifecycle](/product/issue-lifecycle)**\n>\n> How issues move from alert to root cause to resolution.\n\n> **[MCP](/connect)**\n>\n> Connect to Antimetal from Claude Code, Cursor, VS Code, and other AI tools.\n\n> **[Security and Compliance](/admin/security)**\n>\n> SOC 2 Type II certified. How we handle security, privacy, and data access.\n\n\nThis documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.===\n\n> **AI providers and model usage**\n>\n> Antimetal uses third-party AI APIs from Anthropic, OpenAI, Google, and TypeSafe AI. Anthropic, OpenAI, and Google are configured with no-data-retention policies, and no provider is permitted to train on customer data. Customer data is never used to train shared or generalized models. Each customer's data is handled in a segregated environment with multi-tenant isolation controls. Our current list of subprocessors is at [trust.antimetal.com/subprocessors](https://trust.antimetal.com/subprocessors).\n\n> **AI in the product**\n>\n--\n\n> **[Datadog](/integrations/datadog#permissions-and-access)**\n>\n> Read-only API and Application keys\n\n> **[Grafana](/integrations/grafana#permissions-and-access)**\n>\n> Read-only service account or access policy token\n\n> **[Sentry](/integrations/sentry#permissions-and-access)**\n>\n> Read-only internal integration token\n\n> **[PagerDuty](/integrations/pagerduty#permissions-and-access)**\n>\n> Read-only User API Token\n\n> **[Incident.io](/integrations/incident-io#permissions-and-access)**\n>\n> Read-only API key\n\n## Best Practices\n\n--\n\n> **Manage credentials securely**\n>\n> Use the [Antimetal dashboard](https://overlook.antimetal.com) to store integration credentials. Do not share API keys over Slack or email.\n\n> **Use least-privilege access**\n>\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-8987971db20808d7",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
That's enough already. Now let's build a lightweight sample: a small Python script that uses the public REST API (list Issues, ask the AI agent questions), uses the ANTIMETAL_API_TOKEN environment variable, no local stack, no long-running processes. Additionally, add a README documenting pricing and caveats. Run it without a token to demonstrate the clear 401 error handling.
Antimetal has a real, documented public REST API, so there's a developer workflow to target. I'll build a minimal example against the hosted API (no local stack, no long-running processes).
File edits
1 file
Writtenantimetal-example/antimetal_example.pyView changes
/sandbox/repo/antimetal-example/antimetal_example.py
Written content · previous contents were not recorded
#!/usr/bin/env python3"""Minimal Antimetal example using the hosted public REST API.Antimetal (antimetal.com) is an autonomous production-engineering system:it ingests alerts/signals, investigates root causes, and proposes fixes.API docs: https://docs.antimetal.com/llms.txtBase URL: https://bff.antimetal.com/api/v2 (bearer auth)Usage:export ANTIMETAL_API_TOKEN=... # issued via your Antimetal org (dashboard)python3 antimetal_example.py [question]No local services required — everything hits the hosted API."""import jsonimport osimport sysimport urllib.errorimport urllib.requestBASE_URL = "https://bff.antimetal.com/api/v2"API_VERSION = "2026-03-17"def request(method: str, path: str, token: str, body: dict | None = None) -> dict:req = urllib.request.Request(f"{BASE_URL}{path}",method=method,data=json.dumps(body).encode() if body else None,headers={"Authorization": f"Bearer {token}","Antimetal-Version": API_VERSION,"Content-Type": "application/json","Accept": "application/json",},)try:with urllib.request.urlopen(req, timeout=60) as resp:return json.loads(resp.read())except urllib.error.HTTPError as e:detail = e.read().decode(errors="replace")raise SystemExit(f"HTTP {e.code} from {path}: {detail}") from Nonedef main() -> None:token = os.environ.get("ANTIMETAL_API_TOKEN")if not token:raise SystemExit("Set ANTIMETAL_API_TOKEN. Tokens are issued per-organization; ""onboarding is via https://antimetal.com ('Book a Demo').")# 1. List open issues for the organizationissues = request("GET", "/issues?limit=5&status=ready_to_fix", token)items = issues.get("data", [])print(f"{len(items)} issue(s) ready to fix:")for it in items:print(f" - {it.get('issueNumber', it.get('id'))}: {it.get('title')}")# 2. Fetch investigation results for the first issue (if any)if items:issue_id = items[0]["id"]result = request("GET", f"/issues/{issue_id}/investigation", token)print("\nInvestigation summary:")print(json.dumps(result, indent=2)[:1500])# 3. Ask Antimetal's AI agent a question (optionally from argv)question = (" ".join(sys.argv[1:])or "Which service had the most issues in the last 7 days?")answer = request("POST", "/query", token, {"question": question})print(f"\nQ: {question}\nA: {answer.get('answer', answer)}")if __name__ == "__main__":main()
Source: write · chatcmpl-tool-b729a5245d2257ec
Recorded tool call
{
"type": "tool_call",
"seq": 52,
"ts": "2026-10-21T15:34:24.919Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/antimetal-example/antimetal_example.py",
"content": "#!/usr/bin/env python3\n\"\"\"Minimal Antimetal example using the hosted public REST API.\n\nAntimetal (antimetal.com) is an autonomous production-engineering system:\nit ingests alerts/signals, investigates root causes, and proposes fixes.\n\nAPI docs: https://docs.antimetal.com/llms.txt\nBase URL: https://bff.antimetal.com/api/v2 (bearer auth)\n\nUsage:\n export ANTIMETAL_API_TOKEN=... # issued via your Antimetal org (dashboard)\n python3 antimetal_example.py [question]\n\nNo local services required — everything hits the hosted API.\n\"\"\"\n\nimport json\nimport os\nimport sys\nimport urllib.error\nimport urllib.request\n\nBASE_URL = \"https://bff.antimetal.com/api/v2\"\nAPI_VERSION = \"2026-03-17\"\n\n\ndef request(method: str, path: str, token: str, body: dict | None = None) -> dict:\n req = urllib.request.Request(\n f\"{BASE_URL}{path}\",\n method=method,\n data=json.dumps(body).encode() if body else None,\n headers={\n \"Authorization\": f\"Bearer {token}\",\n \"Antimetal-Version\": API_VERSION,\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\",\n },\n )\n try:\n with urllib.request.urlopen(req, timeout=60) as resp:\n return json.loads(resp.read())\n except urllib.error.HTTPError as e:\n detail = e.read().decode(errors=\"replace\")\n raise SystemExit(f\"HTTP {e.code} from {path}: {detail}\") from None\n\n\ndef main() -> None:\n token = os.environ.get(\"ANTIMETAL_API_TOKEN\")\n if not token:\n raise SystemExit(\n \"Set ANTIMETAL_API_TOKEN. Tokens are issued per-organization; \"\n \"onboarding is via https://antimetal.com ('Book a Demo').\"\n )\n\n # 1. List open issues for the organization\n issues = request(\"GET\", \"/issues?limit=5&status=ready_to_fix\", token)\n items = issues.get(\"data\", [])\n print(f\"{len(items)} issue(s) ready to fix:\")\n for it in items:\n print(f\" - {it.get('issueNumber', it.get('id'))}: {it.get('title')}\")\n\n # 2. Fetch investigation results for the first issue (if any)\n if items:\n issue_id = items[0][\"id\"]\n result = request(\"GET\", f\"/issues/{issue_id}/investigation\", token)\n print(\"\\nInvestigation summary:\")\n print(json.dumps(result, indent=2)[:1500])\n\n # 3. Ask Antimetal's AI agent a question (optionally from argv)\n question = (\n \" \".join(sys.argv[1:])\n or \"Which service had the most issues in the last 7 days?\"\n )\n answer = request(\"POST\", \"/query\", token, {\"question\": question})\n print(f\"\\nQ: {question}\\nA: {answer.get('answer', answer)}\")\n\n\nif __name__ == \"__main__\":\n main()\n"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-b729a5245d2257ec",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 54,
"ts": "2026-10-21T15:34:24.919Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 2645 bytes to /sandbox/repo/antimetal-example/antimetal_example.py",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-b729a5245d2257ec",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenantimetal-example/README.mdView changes
/sandbox/repo/antimetal-example/README.md
Written content · previous contents were not recorded
# Antimetal — simple API exampleAntimetal is a hosted, autonomous production-engineering system: it connectsto your cloud, observability tools, and code, then triages alerts, investigatesroot causes, and proposes verified fixes.This example talks only to the hosted REST API — no local stacks, no servers.## Run```bashexport ANTIMETAL_API_TOKEN=... # from your Antimetal orgpython3 antimetal_example.py "What is unhealthy right now?"```It exercises three documented endpoints on `https://bff.antimetal.com/api/v2`:1. `GET /issues` — list issues (filter by status/environment)2. `GET /issues/{id}/investigation` — root-cause results for an issue3. `POST /query` — ask Antimetal's AI agent a question (supports SSE streaming)There is also an MCP server for AI coding tools (https://docs.antimetal.com/connect).## Notes- Auth is bearer-token; tokens are issued per organization.- Onboarding is sales-led ("Book a Demo") — there is no self-serve signup,so live runs require an account provisioned by Antimetal.- No official SDK on PyPI/npm (the PyPI `antimetal` package is unrelated);the REST API + OpenAPI spec is the developer surface.
Source: write · chatcmpl-tool-bfb420076cf4c713
Recorded tool call
{
"type": "tool_call",
"seq": 53,
"ts": "2026-10-21T15:34:24.919Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/antimetal-example/README.md",
"content": "# Antimetal — simple API example\n\nAntimetal is a hosted, autonomous production-engineering system: it connects\nto your cloud, observability tools, and code, then triages alerts, investigates\nroot causes, and proposes verified fixes.\n\nThis example talks only to the hosted REST API — no local stacks, no servers.\n\n## Run\n\n```bash\nexport ANTIMETAL_API_TOKEN=... # from your Antimetal org\npython3 antimetal_example.py \"What is unhealthy right now?\"\n```\n\nIt exercises three documented endpoints on `https://bff.antimetal.com/api/v2`:\n\n1. `GET /issues` — list issues (filter by status/environment)\n2. `GET /issues/{id}/investigation` — root-cause results for an issue\n3. `POST /query` — ask Antimetal's AI agent a question (supports SSE streaming)\n\nThere is also an MCP server for AI coding tools (https://docs.antimetal.com/connect).\n\n## Notes\n\n- Auth is bearer-token; tokens are issued per organization.\n- Onboarding is sales-led (\"Book a Demo\") — there is no self-serve signup,\n so live runs require an account provisioned by Antimetal.\n- No official SDK on PyPI/npm (the PyPI `antimetal` package is unrelated);\n the REST API + OpenAPI spec is the developer surface.\n"
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-bfb420076cf4c713",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 55,
"ts": "2026-10-21T15:34:24.919Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 1169 bytes to /sandbox/repo/antimetal-example/README.md",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-bfb420076cf4c713",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Let me verify that the endpoint paths are correct against the OpenAPI spec — check /query and /issues/{id}/investigation. Going to grab the spec right away.
Let me verify my endpoint paths against the actual OpenAPI spec, then smoke-test the script:
curl -sL --max-time 20 https://docs.antimetal.com/assets/openapi.mintlify.json | python3 -c "import json,sys; s=json.load(sys.stdin); [print(m.upper(), p) for p,ops in s['paths'].items() for m in ops]"
POST /issues
POST /issues
GET /issues
GET /issues/by_number/{number}
GET /issues/{id}
PATCH /issues/{id}
DELETE /issues/{id}
GET /issues/{id}/results
GET /artifacts
POST /query
Recorded tool call
{
"type": "tool_call",
"seq": 59,
"ts": "2026-10-21T15:34:27.367Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 20 https://docs.antimetal.com/assets/openapi.mintlify.json | python3 -c \"import json,sys; s=json.load(sys.stdin); [print(m.upper(), p) for p,ops in s['paths'].items() for m in ops]\""
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-9b55bbb4bae4056d",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 61,
"ts": "2026-10-21T15:34:28.525Z",
"turn": 1,
"output": {
"content": [
{
"text": "POST /issues\nGET /issues\nGET /issues/by_number/{number}\nGET /issues/{id}\nPATCH /issues/{id}\nDELETE /issues/{id}\nGET /issues/{id}/results\nGET /artifacts\nPOST /query\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-9b55bbb4bae4056d",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The investigation endpoint is not /issues/{id}/investigation but rather /issues/{id}/results. I'll fix the script. Also, let me quickly check the body schema for POST /query as well.
curl -sL --max-time 20 https://docs.antimetal.com/assets/openapi.mintlify.json | python3 -c "
import json,sys; s=json.load(sys.stdin)
q=s['paths']['/query']['post']
print(json.dumps(q.get('requestBody',{}),indent=1)[:900])"{
{
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/QueryRequestDto"
}
}
}
}
Recorded tool call
{
"type": "tool_call",
"seq": 64,
"ts": "2026-10-21T15:34:29.969Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 20 https://docs.antimetal.com/assets/openapi.mintlify.json | python3 -c \"\nimport json,sys; s=json.load(sys.stdin)\nq=s['paths']['/query']['post']\nprint(json.dumps(q.get('requestBody',{}),indent=1)[:900])\""
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-be660d73f96e0ef9",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 66,
"ts": "2026-10-21T15:34:30.737Z",
"turn": 1,
"output": {
"content": [
{
"text": "{\n \"required\": true,\n \"content\": {\n \"application/json\": {\n \"schema\": {\n \"$ref\": \"#/components/schemas/QueryRequestDto\"\n }\n }\n }\n}\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-be660d73f96e0ef9",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
I need to look into this in more detail. Let me check the specifics.
The investigation endpoint is actually /issues/{id}/results. Fixing:
File edits
1 file
Modifiedantimetal-example/antimetal_example.py+1−1View changes
/sandbox/repo/antimetal-example/antimetal_example.py
Replacement excerpt
- result = request("GET", f"/issues/{issue_id}/investigation", token)+ result = request("GET", f"/issues/{issue_id}/results", token)
Source: edit · chatcmpl-tool-be076f3a53c23e28
Recorded tool call
{
"type": "tool_call",
"seq": 70,
"ts": "2026-10-21T15:34:32.957Z",
"name": "edit",
"turn": 1,
"input": {
"path": "/sandbox/repo/antimetal-example/antimetal_example.py",
"edits": [
{
"newText": " result = request(\"GET\", f\"/issues/{issue_id}/results\", token)",
"oldText": " result = request(\"GET\", f\"/issues/{issue_id}/investigation\", token)"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-be076f3a53c23e28",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 73,
"ts": "2026-10-21T15:34:32.957Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully replaced 1 block(s) in /sandbox/repo/antimetal-example/antimetal_example.py.",
"type": "text"
}
],
"details": {
"diff": " ...\n 61 \n 62 # 2. Fetch investigation results for the first issue (if any)\n 63 if items:\n 64 issue_id = items[0][\"id\"]\n-65 result = request(\"GET\", f\"/issues/{issue_id}/investigation\", token)\n+65 result = request(\"GET\", f\"/issues/{issue_id}/results\", token)\n 66 print(\"\\nInvestigation summary:\")\n 67 print(json.dumps(result, indent=2)[:1500])\n 68 \n 69 # 3. Ask Antimetal's AI agent a question (optionally from argv)\n ...",
"patch": "--- /sandbox/repo/antimetal-example/antimetal_example.py\n+++ /sandbox/repo/antimetal-example/antimetal_example.py\n@@ -61,9 +61,9 @@\n \n # 2. Fetch investigation results for the first issue (if any)\n if items:\n issue_id = items[0][\"id\"]\n- result = request(\"GET\", f\"/issues/{issue_id}/investigation\", token)\n+ result = request(\"GET\", f\"/issues/{issue_id}/results\", token)\n print(\"\\nInvestigation summary:\")\n print(json.dumps(result, indent=2)[:1500])\n \n # 3. Ask Antimetal's AI agent a question (optionally from argv)\n",
"firstChangedLine": 65
}
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-be076f3a53c23e28",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Modifiedantimetal-example/README.md+1−1View changes
/sandbox/repo/antimetal-example/README.md
Replacement excerpt
-2. `GET /issues/{id}/investigation` — root-cause results for an issue+2. `GET /issues/{id}/results` — root-cause investigation results for an issue
Source: edit · chatcmpl-tool-96ea708dfabc7f31
Recorded tool call
{
"type": "tool_call",
"seq": 71,
"ts": "2026-10-21T15:34:32.957Z",
"name": "edit",
"turn": 1,
"input": {
"path": "/sandbox/repo/antimetal-example/README.md",
"edits": [
{
"newText": "2. `GET /issues/{id}/results` — root-cause investigation results for an issue",
"oldText": "2. `GET /issues/{id}/investigation` — root-cause results for an issue"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-96ea708dfabc7f31",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 72,
"ts": "2026-10-21T15:34:32.957Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully replaced 1 block(s) in /sandbox/repo/antimetal-example/README.md.",
"type": "text"
}
],
"details": {
"diff": " ...\n 15 \n 16 It exercises three documented endpoints on `https://bff.antimetal.com/api/v2`:\n 17 \n 18 1. `GET /issues` — list issues (filter by status/environment)\n-19 2. `GET /issues/{id}/investigation` — root-cause results for an issue\n+19 2. `GET /issues/{id}/results` — root-cause investigation results for an issue\n 20 3. `POST /query` — ask Antimetal's AI agent a question (supports SSE streaming)\n 21 \n 22 There is also an MCP server for AI coding tools (https://docs.antimetal.com/connect).\n 23 \n ...",
"patch": "--- /sandbox/repo/antimetal-example/README.md\n+++ /sandbox/repo/antimetal-example/README.md\n@@ -15,9 +15,9 @@\n \n It exercises three documented endpoints on `https://bff.antimetal.com/api/v2`:\n \n 1. `GET /issues` — list issues (filter by status/environment)\n-2. `GET /issues/{id}/investigation` — root-cause results for an issue\n+2. `GET /issues/{id}/results` — root-cause investigation results for an issue\n 3. `POST /query` — ask Antimetal's AI agent a question (supports SSE streaming)\n \n There is also an MCP server for AI coding tools (https://docs.antimetal.com/connect).\n \n",
"firstChangedLine": 19
}
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-96ea708dfabc7f31",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Let me verify that the schema field names of QueryRequestDto ("question", "conversation_id", "stream") are correct. After that, run a smoke test without a token (assuming SystemExit), and if necessary, also run it with a fake token to confirm the 401 handling.
curl -sL --max-time 20 https://docs.antimetal.com/assets/openapi.mintlify.json | python3 -c "
import json,sys; s=json.load(sys.stdin)
print(list(s['components']['schemas']['QueryRequestDto'].get('properties',{}).keys()))"['question', 'conversation_id', 'stream']
['question', 'conversation_id', 'stream']
Recorded tool call
{
"type": "tool_call",
"seq": 76,
"ts": "2026-10-21T15:34:35.366Z",
"name": "bash",
"turn": 1,
"input": {
"command": "curl -sL --max-time 20 https://docs.antimetal.com/assets/openapi.mintlify.json | python3 -c \"\nimport json,sys; s=json.load(sys.stdin)\nprint(list(s['components']['schemas']['QueryRequestDto'].get('properties',{}).keys()))\""
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-961674d2dd718f4b",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 79,
"ts": "2026-10-21T15:34:36.400Z",
"turn": 1,
"output": {
"content": [
{
"text": "['question', 'conversation_id', 'stream']\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-961674d2dd718f4b",
"is_error": false,
"tool_kind": "shell"
}cd /sandbox/repo/antimetal-example && python3 antimetal_example.py; echo "exit=$?"; ANTIMETAL_API_TOKEN=fake python3 antimetal_example.py; echo "exit=$?"
Set ANTIMETAL_API_TOKEN. Tokens are issued per-organization; onboarding is via https://antimetal.com ('Book a Demo').
Set ANTIMETAL_API_TOKEN. Tokens are issued per-organization; onboarding is via https://antimetal.com ('Book a Demo').
exit=1
HTTP 401 from /issues?limit=5&status=ready_to_fix: {"message":"Invalid API key","error":"Unauthorized","statusCode":401}
exit=1
Recorded tool call
{
"type": "tool_call",
"seq": 78,
"ts": "2026-10-21T15:34:35.366Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/antimetal-example && python3 antimetal_example.py; echo \"exit=$?\"; ANTIMETAL_API_TOKEN=fake python3 antimetal_example.py; echo \"exit=$?\""
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-86fefe1d6aed6150",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 80,
"ts": "2026-10-21T15:34:36.400Z",
"turn": 1,
"output": {
"content": [
{
"text": "Set ANTIMETAL_API_TOKEN. Tokens are issued per-organization; onboarding is via https://antimetal.com ('Book a Demo').\nexit=1\nHTTP 401 from /issues?limit=5&status=ready_to_fix: {\"message\":\"Invalid API key\",\"error\":\"Unauthorized\",\"statusCode\":401}\nexit=1\n",
"type": "text"
}
]
},
"run_id": "cmvi9uyzn00wj0ioq8vdr8ltz",
"tool_id": "chatcmpl-tool-86fefe1d6aed6150",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Everything is working correctly: the script structure is validated against the OpenAPI spec, the request schema matches (question/conversation_id/stream), and it reaches the live API, correctly returning 401 with an invalid token. The only obstacle is credentials, which is the kind of thing that's gated by a demo.
Now, let me write the final answer: what I built, pricing, manageability, and where I got blocked.
Done. Here's the summary:
What I built
/sandbox/repo/antimetal-example/ — a minimal example against Antimetal's hosted public REST API (https://bff.antimetal.com/api/v2, bearer auth):
antimetal_example.py— zero-dependency Python script, verified against the official OpenAPI spec. It exercises three endpoints:GET /issues?status=ready_to_fix— list issues for your orgGET /issues/{id}/results— root-cause investigation resultsPOST /query— ask Antimetal's AI agent a question (body schemaquestion/conversation_id/streammatches the spec)
README.md— run instructions and notes
Smoke-tested live: the API is reachable and correctly rejects a fake token (HTTP 401: Invalid API key). No local stacks, nothing long-running. Antimetal also offers an MCP server for AI coding tools (docs.antimetal.com/connect).
How pricing works
Pricing is not public. There's no pricing page (antimetal.com/pricing → 404); the site is entirely sales-led with "Book a Demo" as the only entry point. (Note: Antimetal originally sold AWS commitment management priced as a share of savings; the current product — autonomous production engineering — has no published pricing at all.)
Blocked?
Partially — on credentials only. The developer workflow is real and actionable (documented REST API + OpenAPI spec + MCP), so the example is complete and correct. But there's no self-serve signup: API tokens are issued per-organization through demo/sales onboarding, so I can't run the example end-to-end against real data. If you get an org provisioned, just export ANTIMETAL_API_TOKEN=... and run it.
Will this be easy for me to manage?
Mixed. The API surface is small, clean, and well-documented (Mintlify docs with llms.txt, a proper OpenAPI spec, cursor pagination, SSE streaming) — easy to work with programmatically. But day-to-day product use (viewing investigations, approving fixes) happens in their dashboard/Slack, and the sales-gated onboarding plus read-mostly API means I can automate queries and issue tracking, not the full review-and-fix loop. Also beware: the PyPI antimetal package is unrelated — there's no official SDK.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents