Route any REST API call through a BunnyLogs logspace and automatically record every request and response in real time.
Once proxy is enabled on a logspace, replace the base URL of any API call with:
https://bunnylogs.com/proxy/<logspace-uuid>/<target-host>
BunnyLogs forwards the request verbatim to https://<target-host>, returns the response unchanged to the caller, and logs both sides live in the stream.
Any number of different APIs can be proxied through the same logspace — the target host is part of the URL, so no pre-configuration is required per destination.
https://bunnylogs.com/proxy/<uuid>/<target-host>/<path>
| Original call | Proxied call |
|---|---|
POST https://api.stripe.com/v1/charges |
POST https://bunnylogs.com/proxy/<uuid>/api.stripe.com/v1/charges |
GET https://api.openai.com/v1/models |
GET https://bunnylogs.com/proxy/<uuid>/api.openai.com/v1/models |
GET https://api.github.com/repos/org/repo/issues?state=open |
GET https://bunnylogs.com/proxy/<uuid>/api.github.com/repos/org/repo/issues?state=open |
All HTTP methods are supported. Query strings, request bodies, and headers pass through unchanged.
Each proxied call produces one log entry in the stream. The program field is set to the target hostname so entries from different APIs are easy to distinguish:
→ POST api.stripe.com/v1/charges ← 200 (142ms)
authorization: Bearer ***
content-type: application/json
{"amount": 2000, "currency": "usd", "source": "tok_visa"}
Response:
{"id": "ch_3abc...", "status": "succeeded", "amount": 2000, ...}
Authorization, X-Api-Key, Cookie, and similar headers are automatically masked to Bearer *** in the log. The real value is still forwarded to the target.The log level reflects the HTTP status: INFO for 2xx/3xx, WARNING for 4xx, ERROR for 5xx and network failures.
curl
PROXY="https://bunnylogs.com/proxy/<uuid>"
# Stripe
curl -X POST "$PROXY/api.stripe.com/v1/charges" \
-u sk_live_...: \
-d amount=2000 -d currency=usd
# OpenAI
curl "$PROXY/api.openai.com/v1/models" \
-H "Authorization: Bearer $OPENAI_API_KEY"
Python (requests)
import requests
PROXY = "https://bunnylogs.com/proxy/<uuid>"
# Call any API — just swap the base URL
resp = requests.post(
f"{PROXY}/api.stripe.com/v1/charges",
auth=("sk_live_...", ""),
data={"amount": 2000, "currency": "usd"},
)
print(resp.json()) # real Stripe response
Node.js (fetch)
const PROXY = "https://bunnylogs.com/proxy/<uuid>";
const resp = await fetch(`${PROXY}/api.openai.com/v1/chat/completions`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-4o",
messages: [{ role: "user", content: "Hello" }],
}),
});
const data = await resp.json();