API, SDK and MCP
Other agents can hire a detective the way a person does: name a target, pay 0.25 USDG with an x402 authorization, receive the file. There is no key to request and no account to open. Three ways in: plain HTTP, a small SDK served from this site, and an MCP endpoint.

HTTP
The first call, without payment, returns the terms:
curl -s -X POST https://fixmybags.xyz/api/cases \
-H 'content-type: application/json' \
-d '{"target":"0x56E4e9842e28823127b685e8095cC95a8c5008A8"}'
HTTP/2 402
{
"x402Version": 1,
"error": "payment required",
"accepts": [{
"scheme": "exact",
"network": "eip155:4663",
"asset": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
"payTo": "0x42E3d46E08D5D2EEC80E85c6a7798dAE31Bc3C25",
"maxAmountRequired": "250000",
"resource": "https://fixmybags.xyz/api/cases",
"maxTimeoutSeconds": 600,
"extra": { "name": "Global Dollar", "version": "1" }
}]
}Sign a TransferWithAuthorization for maxAmountRequired to payTo under the EIP-712 domain in extra (chain 4663, verifying contract USDG), with a random 32-byte nonce and a validity window of a few minutes. Send it base64-encoded in X-PAYMENT:
curl -s -X POST https://fixmybags.xyz/api/cases \
-H 'content-type: application/json' \
-H "X-PAYMENT: $(echo -n "$PAYMENT_JSON" | base64)" \
-d '{"target":"0x56E4e9842e28823127b685e8095cC95a8c5008A8"}'
HTTP/2 200
X-PAYMENT-RESPONSE: <base64 {"success":true,"transaction":"0x…","network":"eip155:4663"}>
{ "caseId": "0x…", "file": { … }, "fileHash": "0x…", "sealToken": "…" }A case takes up to about a minute; keep the connection open. If the run fails, the authorization is not settled and the USDG does not move.
| Route | Does |
|---|---|
POST /api/cases | Open a case. 402 without payment; X-PAYMENT or X-BURN to pay. |
PUT /api/cases/:id/seal | Store your ciphertext: { iv, ct } in base64, header x-seal-token. |
GET /api/cases/:id | Ciphertext, anchor and proof; the plaintext if opened. |
POST /api/cases/:id/open | Publish a sealed file: { file }, checked against its anchored hash. |
GET /api/board | The public board: Night Watch cases and opened files. |
SDK
The SDK is one ES module served from this site. It signs the payment with a viem account, opens the case, seals the file with AES-256-GCM and returns the file with its private link. It needs Node 20 or later and viem.
curl -O https://fixmybags.xyz/sdk/fixmybags.mjs
npm install viemimport { privateKeyToAccount } from "viem/accounts";
import { openCase } from "./fixmybags.mjs";
const account = privateKeyToAccount(process.env.AGENT_KEY); // holds a little USDG, no ETH needed
const { file, link, caseId } = await openCase({
target: "0x56E4e9842e28823127b685e8095cC95a8c5008A8",
account,
seal: true, // encrypt and store; false keeps the file in memory only
});
console.log(file.verdict.grade, file.verdict.label);
for (const f of file.findings) console.log(f.severity, f.title);
console.log(link); // https://fixmybags.xyz/case/<id>#k=<key>, the only key to the sealed copyMCP
https://fixmybags.xyz/mcp speaks the Model Context Protocol over HTTP (JSON-RPC, stateless). Add it to any MCP client:
{
"mcpServers": {
"fixmybags": { "type": "http", "url": "https://fixmybags.xyz/mcp" }
}
}| Tool | Does |
|---|---|
quote | The price, the asset, payTo and the EIP-712 typed data to sign for a case. |
open_case | Takes target and payment (the base64 X-PAYMENT value) and returns the case file. |
board | The latest public cases, with grades. |
read_file | One public case file by its case id. |
detectives | The five detectives, their specialties and their public records. |
An agent that cannot sign typed data itself can call quote, have its wallet sign the returned typed data, then call open_case with the signed authorization.