stubfetch
Deterministic, in-process fake HTTP APIs for testing agents and tools. Swap real network calls for canned GitHub, Stripe, Postgres-shaped data, OpenAI / Anthropic-style LLM JSON, S3-like objects, Slack Web API responses—while recording traffic, exporting JSON / Markdown / HAR, running eval scenarios, and optionally injecting chaos (latency, random failures).
Same ideas in TypeScript (npm) and Python (PyPI / local install).
Install
JavaScript / TypeScript (npm)
npm install stubfetch
Requires Node.js ≥ 18. No runtime npm dependencies.
Python
pip install stubfetch
From a clone (editable):
pip install -e ./python
Requires Python ≥ 3.10.
Quick start
TypeScript
import { GhostEnv, github, exportRecordingJSON } from "stubfetch";
const env = new GhostEnv({
seed: 42,
providers: [github({ issues: [{ repo: "acme/api", title: "Bug" }] })],
});
const res = await env.fetch("https://api.github.com/repos/acme/api/issues");
console.log(await res.json());
console.log(exportRecordingJSON(env.calls()));
Python
from stubfetch import GhostEnv, github, export_recording_json
env = GhostEnv(
{"seed": 1, "providers": [github({"issues": [{"repo": "acme/api", "title": "Bug"}]})]}
)
status, text = env.fetch("https://api.github.com/repos/acme/api/issues")
assert status == 200
print(export_recording_json(env.calls()))
Features
| Area | What you get |
|---|---|
| Presets | GitHub issues, Stripe customers, Postgres db().query(), OpenAI chat, Anthropic messages, S3 GET/list, Slack auth.test / chat.postMessage |
GhostEnv.fetch |
Same shape as globalThis.fetch; routes to the first matching provider |
| Recording | calls(), wasCalled(), exportRecordingJSON / Markdown / HAR |
| Eval | runEval + defineScenario for scripted agent tests |
| Replay | ReplayFixture replays canned responses in order |
| Chaos | chaos: { minLatencyMs, failureRate } on config |
Documentation
Hosted on slaps.dev:
| Doc | Contents |
|---|---|
| Overview | Product summary and doc index |
| Getting started | Providers, fetch, recording |
| Use cases | Agents, agentpad, eval patterns |
| Presets | URLs, config shapes, matching rules |
| API reference | GhostEnv, Provider, eval, replay, exports |
| Testing & chaos | runEval, chaos options, failure recording |
| Python notes | Node vs Python differences |
License
Apache-2.0
Release files for stubfetch 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| stubfetch-0.1.0.tar.gz | 7.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| stubfetch-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.2 kB
Release files / stubfetch-0.1.0.tar.gz
| Download URL | stubfetch-0.1.0.tar.gz |
|---|---|
| Size | 7.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f35be3352f1435cf0667bc0d367072d52cd0e36653f5e7c2fc055151de1ee346
|
|
BLAKE2b-256 checksum How to use checksums |
d78eb267c569ea9533c1971c2adfefe715994b86e5493d9b86aa84f34359fa72
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.16.5 cpython/3.14.3 HTTPX/0.28.1
|
Release files / stubfetch-0.1.0-py3-none-any.whl
| Download URL | stubfetch-0.1.0-py3-none-any.whl |
|---|---|
| Size | 9.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4e676b8f93dab3f3886ce09762350d7d78ed79fa5526deca7710b1c122c22bbb
|
|
BLAKE2b-256 checksum How to use checksums |
8adf6b01dc2ca35d5c05e5515c846e23470832c9ae7650ee8b85c794b1d4f21e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.16.5 cpython/3.14.3 HTTPX/0.28.1
|