apifacts

io.github.IllouminusPublished by GitHub account Illouminusv0.2.1Updated Oct 27, 2026

Verified facts and typed fixes for failing third-party API calls (Stripe, GitHub, Google…)

VerifiedSTDIODesktop onlyKnowledge & MemoryDeveloper Tools

Overview

AI-generated overview

Exposes one check tool that returns verified, dated facts and typed fixes about how third-party APIs, SDKs and CLIs actually behave when a call fails.

What you can do
  • Look up a failing third-party API call: send the target, method, status and body excerpt, and get matching verified facts with typed fixes.
  • Read what scheduled probes observed for a registered endpoint template, plus an unknown reason when nothing matches.
  • Answer offline from a snapshot packaged with the package, without sending anything.
  • Scan logs for failed HTTP calls printed by requests, httpx, gh, axios or curl -f and query each one.
When to use it
Useful when an assistant is debugging errors from third-party APIs such as Stripe, GitHub or Google and the official docs do not explain the observed behavior, or when a CI build fails on an HTTP call and the known traps should be surfaced.
Requirements
Runs locally over stdio as a Python package launched with uvx (apifacts with the mcp extra), so Python and uv are needed. No authentication, environment variables or headers are declared. Online lookups need network access to the apifacts.dev API; offline mode needs none.
Before you install
Online check requests are treated as contributions: if the target matches a registered template, a normalized observation is stored, though bodies, headers, query strings and raw IPs are excluded. The error body excerpt you send goes to the apifacts.dev service. Offline mode avoids any transmission.

Installation

In SourceWeft

  1. Open apifacts in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

apifacts

A verified changelog of reality for AI agents. An open registry of typed, dated facts about what third-party machine interfaces (HTTP APIs, SDK packages, CLIs) actually do today, as opposed to what their docs say.

Why

Interfaces change, docs lag, and nobody tells the agent. Every session pays tokens to rediscover the same traps: a 200 with an empty array instead of a 429, a rate limit reported as status: 0 in the body, an SDK release that silently dropped a field. Documentation tools answer "give me the right docs"; apifacts answers "the docs are wrong about this endpoint right now, here is the verified difference".

Install

bash
pip install apifacts-pytest   # pytest plugin: a test failing on an HTTP error prints the known factsuvx apifacts check https://api.stripe.com/v1/charges -X GET --status 401   # CLI (and library)npx skills add Illouminus/apifacts   # agent skill: on an API error, ask the registry first

Both packages are on PyPI, carry the same version and ship together from one tag (release). The plugin sends nothing until a test fails. The skill (skills/apifacts/SKILL.md) tells Claude Code and other agents when to call apifacts check and how to read the answer.

CI

Agents that fix a red build read the failing step's log, the annotations and the job summary. The GitHub Action puts the known facts in all three (action/README.md):

yaml
- uses: Illouminus/apifacts/action@v0  with:    run: pytest -q   # same exit code as without the action; scanned only when it fails

Anywhere else, pipe a log through apifacts scan (uvx apifacts scan build.log): it finds the failed HTTP calls that requests, httpx, gh, axios and curl -f print, and asks about each.

MCP

One tool, check(target, method, status, body), over stdio; no resources, no prompts. Claude Code:

bash
claude mcp add apifacts -- uvx --from 'apifacts[mcp]' apifacts mcp

Claude Desktop, Cursor and other clients (mcpServers in their JSON config):

json
{"mcpServers": {"apifacts": {"command": "uvx", "args": ["--from", "apifacts[mcp]", "apifacts", "mcp"]}}}

apifacts mcp --offline answers from the snapshot packaged in the wheel and sends nothing.

How a fact is verified

  • One fact per YAML file in facts/<service>/, with a kind (error_meaning, rate_limit, breaking_change, ...), the exact error signal, a one-sentence claim, dimensions (env, plan, region, account_state) and evidence.
  • Truth comes only from deterministic probes: declarative HTTP steps and assertions that our runner executes on a schedule. No language model is called anywhere in the verification path.
  • Fixes are data, not advice: members of a closed vocabulary with typed parameters (no free text, no shell, no foreign URLs), rendered to one English sentence by us.
  • A probe in another environment never refutes a fact; it adds a dimension.

Calling check()

One endpoint answers and learns at the same time: the request is the contribution. Send the target and, optionally, the error you got; receive matching facts with typed fixes and what the probes observe. If the target matches a registered template, a normalized observation is stored (no bodies, headers, query strings or raw IPs).

bash
curl -s https://apifacts.dev/v0/check \  -H 'Content-Type: application/json' \  -d '{"target": {"method": "POST", "url": "https://api.stripe.com/v1/payment_intents"},       "error": {"status": 400, "body_excerpt": "Keys for idempotent requests can only be used with the same parameters they were first used with."}}'

The response is never empty: facts, observed, and an unknown.reason when nothing matches.

Status

The API is live at https://apifacts.dev (/v0/check, /v0/services, /openapi.json, /healthz; facts.baillot.dev, the old address, redirects there). The registry covers the services and facts listed at apifacts.dev/registry, each fact page showing how it was established; /llms.txt describes the API for agents. Design contracts live in docs/specs/.

Running your own copy: the API reads facts/ and services/ once, at startup, so after a git pull restart it; ops/deploy.sh checks out, syncs and restarts in one step.

Contributing

Calling check() is contributing. Pull requests are for humans and API producers: see CONTRIBUTING.md. Producer signatures are always free.

License

Code: MIT. Data (facts/ and the generated fact pages): CC BY 4.0.

Source: README.md at commit 98e9701

Tools

0
SourceWeft started this package once in an isolated sandbox, without credentials, to list its tools. That failed: the package did not install.

Version history

1
  1. v0.2.1LatestOct 26, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts