Skip to content
Gauge

ax-check.com

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.

Onboarding

Give agents a clear login handoff and a way to resume setup.

Agents cannot progress through onboarding without human help. Provide an agent-accessible path through authentication and setup.

Docs

Return Markdown when clients request text/markdown.

Homepage returned text/html for a text/markdown request; no Markdown representation offered.

Docs

Add links to your product documentation and quickstart in /llms.txt.

llms.txt exists but every link points to localhost:3000, an unusable index for readers.

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.

piv0.84.2
modelQwen 3.8 Maxcwd/sandbox/repo
Help me build a simple example using Antimetal. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.
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>&1
402321 /tmp/am.html
402321 /tmp/am.html
---
200
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
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

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
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} 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
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])
EOF
Antimetal 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
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.===
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 
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.

![Search](https://mintcdn.com/antimetal-6e0eb43b/AivrI432HEmaGjlm/images/quick-start/search.png?fit=max\&auto=format\&n=AivrI432HEmaGjlm\&q=85\&s=831f6ffd60df8c8c66c2bde959ddab9a)

## 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.

![Investigation chain of thought](https://mintcdn.com/antimetal-6e0eb43b/AivrI432HEmaGjlm/images/quick-start/investigation.png?fit=max\&auto=format\&n=AivrI432HEmaGjlm\&q=85\&s=2314aca5b6b3a28ad1efca578dfd2a08)

The inputs and outputs to all tool calls are directly accessible, enabling you to understand exactly what data Antimetal is pulling in.

![Tool call inputs and outputs](https://mintcdn.com/antimetal-6e0eb43b/AivrI432HEmaGjlm/images/quick-start/tool-calls.png?fit=max\&auto=format\&n=AivrI432HEmaGjlm\&q=85\&s=b84c9ff5785a46409051bffbf7c5fa31)

### 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.

![Answers tab with root cause and causal graph](https://mintcdn.com/antimetal-6e0eb43b/AivrI432HEmaGjlm/images/quick-start/answers.png?fit=max\&auto=format\&n=AivrI432HEmaGjlm\&q=85\&s=d311786b6269c95db920027989da09be)

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.

![Findings](https://mintcdn.com/antimetal-6e0eb43b/AivrI432HEmaGjlm/images/quick-start/findings.png?fit=max\&auto=format\&n=AivrI432HEmaGjlm\&q=85\&s=4c9d860e178b4223aa47f8bbcdaab863)

### Fixes

The fixes tab contains remediations proposed by Antimetal to address the root cause.

![Fixes tab](https://mintcdn.com/antimetal-6e0eb43b/AivrI432HEmaGjlm/images/quick-start/fixes.png?fit=max\&auto=format\&n=AivrI432HEmaGjlm\&q=85\&s=53102e9d19383257468776baec4064f1)

Each fix contains a detailed explanation, as well the ability to copy it as a prompt or open it in your IDE.

![Fix detail with IDE options](https://mintcdn.com/antimetal-6e0eb43b/AivrI432HEmaGjlm/images/quick-start/fix-detail.png?fit=max\&auto=format\&n=AivrI432HEmaGjlm\&q=85\&s=1e866eee1e86cae17f55280db64f7a71)

### 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.

![Chat interaction](https://mintcdn.com/antimetal-6e0eb43b/AivrI432HEmaGjlm/images/quick-start/chat.png?fit=max\&auto=format\&n=AivrI432HEmaGjlm\&q=85\&s=06b9df5a5ba63182ec61f6e26365c63e)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.
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
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
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**
>
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

Completed
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.txt
Base 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 json
import os
import sys
import urllib.error
import urllib.request
BASE_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 None
def 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 organization
issues = 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()

File edits

1 file

Completed
Writtenantimetal-example/README.mdView changes

/sandbox/repo/antimetal-example/README.md

Written content · previous contents were not recorded

# Antimetal — simple API example
Antimetal is a hosted, autonomous production-engineering system: it connects
to your cloud, observability tools, and code, then triages alerts, investigates
root causes, and proposes verified fixes.
This example talks only to the hosted REST API — no local stacks, no servers.
## Run
```bash
export ANTIMETAL_API_TOKEN=... # from your Antimetal org
python3 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 issue
3. `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.
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
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"
   }
  }
 }
}
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

Completed
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)

File edits

1 file

Completed
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
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']
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
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:
    1. GET /issues?status=ready_to_fix — list issues for your org
    2. GET /issues/{id}/results — root-cause investigation results
    3. POST /query — ask Antimetal's AI agent a question (body schema question/conversation_id/stream matches 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

AX Check by Gauge