Skip to main content

Diagnostic tool for HTTP API issues. Captures or runs a request, runs a battery of checks, produces a structured report with plain-language findings.

Project description

api-medic

A diagnostic tool for HTTP API issues. Paste a curl, upload a HAR, or fire a live request — get a structured report with plain-language findings across DNS, TLS, redirects, CORS, auth, body, and rate limiting.

Try it now

api-medic.markandrewmarquez.com — no install. The Demos tab has eight pre-built scenarios; the Run tab fires a live request from the browser (HTTPS-only, SSRF-guarded, throttled); the HAR tab takes any HAR export from DevTools.

api-medic Report — JWT-expired diagnosis showing critical findings, evidence, and suggested fix

Run tab — request composer for firing a live HTTP request from the browser

HAR tab — file picker for analyzing a HAR export from browser DevTools

What gets checked

19 diagnostic checks across five categories. IDs are stable and namespaced so you can filter, suppress, or reference individual findings without coupling to the human-readable title.

Category Checks
Network & transport (6) network.dns.no_records, network.dns.slow, network.tls.expired, network.tls.expiring_soon, network.tls.weak_protocol, network.tls.cn_mismatch
HTTP semantics (4) http.cors.misconfigured, http.headers.duplicate, http.redirect.loop, http.redirect.protocol_downgrade
Auth (4) auth.missing, auth.jwt.expired, auth.jwt.not_yet_valid, auth.header.whitespace
Body / content (3) body.malformed_json, body.content_length_mismatch, body.encoding_mismatch
Rate limiting (2) rate_limit.hit (429 + Retry-After context), rate_limit.approaching (X-RateLimit-Remaining < 10% of limit)

JWT signatures aren't verified — claims are decoded for exp / nbf checks only. Signature verification needs the issuer's secret/public key, which is out of scope for a client-side diagnostic.

See docs/architecture.md for the full check spec, evidence shape, and design rationale per check.

Install

pip install api-medic

Requires Python 3.10+. The wheel includes the local web UI bundle — no separate frontend install.

Quickstart

# Bare URL — shorthand for `api-medic run`
api-medic https://api.example.com/v1/users

# Full request: method, headers, body
api-medic run https://api.example.com/v1/users \
    --method POST \
    --header "Authorization: Bearer ..." \
    --header "Content-Type: application/json" \
    --body '{"name": "Alex Doe"}'

# Analyze a curl command (defaults to executing it)
api-medic from-curl 'curl -X GET https://api.example.com/v1/users -H "Authorization: Bearer ..."'

# Analyze a captured HAR file (no execution)
api-medic from-har session.har

# Launch the local web UI on http://localhost:8765
api-medic serve

Output flags: --output {terminal,json,markdown,html} (default terminal), --save <path>, --no-color, --verbose.

api-medic CLI terminal output — rich-rendered Report with colored severity badges, timing block, and finding cards showing evidence and suggested fixes

Surfaces

Four ways to use it, all powered by the same core engine — every surface produces a byte-identical Report given the same input.

            ┌────────┐  ┌──────────────┐  ┌─────────────┐  ┌─────────────────┐
            │  CLI   │  │ Local web UI │  │ Hosted demo │  │ Browser ext     │
            └───┬────┘  └──────┬───────┘  └──────┬──────┘  └────────┬────────┘
                │              │                 │                  │
                ▼              ▼                 ▼                  ▼
        ┌────────────────────────────────────────────────────────────────┐
        │                    api_medic.core.engine                       │
        │   parser  ·  runner (httpx + dnspython + cryptography)  ·      │
        │   19 checks  ·  renderers (terminal · json · markdown · html)  │
        └────────────────────────────────────────────────────────────────┘
                                      │
                                      ▼
                              Pydantic Report
  • CLIpip install api-medic, full feature set, four output formats.
  • Local web UIapi-medic serve runs the same engine behind a browser frontend at http://localhost:8765. No outbound calls except to the target you're diagnosing.
  • Hosted demoapi-medic.markandrewmarquez.com. Captured (HAR/curl) and live-run modes. Live runs are HTTPS-only, SSRF-guarded, and throttled (2 req/sec, burst 5). Stateless — no payload is persisted; see PRIVACY.md.
  • Browser extension — Chrome / Firefox MV3 DevTools panel that captures requests in-browser and posts them to the hosted analyzer. See extension/README.md for source-install instructions.

api-medic DevTools panel inside a browser, showing a rendered Report with severity badges, evidence, and suggested fix; the DevTools tab strip (Network, Console, api-medic) visible at the top

Architecture

A pure-Python core engine (parser + runner + 19 checks + four renderers) wrapped by four surfaces. The Lambda surface ships the runner alongside an SSRF guard for live requests; FastAPI / uvicorn are excluded so the cold-start budget stays intact even with httpx, dnspython, and cryptography shipped. The browser extension is a thin capture layer — analysis runs server-side on the hosted Lambda, which is why the same Report component renders identically in the panel and on the hosted demo.

See docs/architecture.md for the full v1 spec, including the Pydantic data model, per-check rationale, and AWS deployment topology.

Contributing

Issues and PRs welcome at github.com/marky224/api-medic. Quality gates enforced in CI: pytest, ruff check . && ruff format --check ., mypy, and make types to keep the TypeScript types in sync with the Pydantic models.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

api_medic-1.1.1.tar.gz (7.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

api_medic-1.1.1-py3-none-any.whl (112.2 kB view details)

Uploaded Python 3

File details

Details for the file api_medic-1.1.1.tar.gz.

File metadata

  • Download URL: api_medic-1.1.1.tar.gz
  • Upload date:
  • Size: 7.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for api_medic-1.1.1.tar.gz
Algorithm Hash digest
SHA256 95ff1b68eaf1c4a37b2a36ca3905d3193e4950a7c1eddc1beece9bec0b2eda45
MD5 36699a5b98bf843650ac2b92e3977c3f
BLAKE2b-256 434677a5bfa618fc86b468a8130b7c893bf77e1e47348e8f69f2c43f68e3720b

See more details on using hashes here.

Provenance

The following attestation bundles were made for api_medic-1.1.1.tar.gz:

Publisher: publish-pypi.yml on marky224/api-medic

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file api_medic-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: api_medic-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 112.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for api_medic-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bcc8e79a82da24930a9d80b539d6a8846a17d8d0eb1d9aa22fd221bc488f7e82
MD5 337c6094750027535737938c391cc9da
BLAKE2b-256 86abec4377412331526e0f778c43b5ebbb75ff3221efe7029f2245daf1b29928

See more details on using hashes here.

Provenance

The following attestation bundles were made for api_medic-1.1.1-py3-none-any.whl:

Publisher: publish-pypi.yml on marky224/api-medic

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page