ARC · PRE-CHECKOUT · EXAMPLES
Copy-paste examples
Call GET /api/precheck?url= before an agent tries to reach checkout. The response is saved ARC checks. The call never fetches the store live, and it does not start a scan.
A detected rail does not prove an agent completed checkout. reachable_checkout is true only when a saved check returned a checkout link. Rate limit: 60 requests a minute for each network, approximate and counted per server instance. Licence: CC BY 4.0, with attribution to ARC (arcreport.ai). MCP tool name: precheck on https://www.arcreport.ai/api/ask.
Fields in these examples
The examples read the fields the API returns today: host, known, reachable_checkout, rails[].name, rails[].status, blockers, last_checked, confidence, licence. Also returned, and not all printed below: report_outcome, source, scan_url.
The response also includes checked_ago, stale, and rails[].proves. These examples do not read them.
curl
curl -sD - "https://www.arcreport.ai/api/precheck?url=https://allbirds.com/products/shoe"
JavaScript fetch
// Node 18+, Deno, Bun, or the browser. CORS is open. No API key.
// This calls ARC. It does not request the store.
const url = "https://allbirds.com/products/shoe";
const res = await fetch("https://www.arcreport.ai/api/precheck?url=" + encodeURIComponent(url));
if (!res.ok) throw new Error("precheck HTTP " + res.status);
const body = await res.json();
console.log(body.host);
console.log(body.known);
console.log(body.reachable_checkout);
console.log(body.last_checked);
console.log(body.confidence);
console.log(body.licence);
for (const rail of body.rails ?? []) {
console.log(rail.name, rail.status);
}Python requests
# pip install requests
# This calls ARC. It does not request the store.
import requests
url = "https://allbirds.com/products/shoe"
response = requests.get("https://www.arcreport.ai/api/precheck", params={"url": url}, timeout=10)
response.raise_for_status()
body = response.json()
print(body["host"])
print(body["known"])
print(body["reachable_checkout"])
print(body["last_checked"])
print(body["confidence"])
print(body["licence"])
for rail in body["rails"] or []:
print(rail["name"], rail["status"])MCP
The precheck tool is served by https://www.arcreport.ai/api/ask. No login. https://www.arcreport.ai/api/mcp does not serve this tool. The argument is url. The tool result is the same JSON as the HTTP read, including last_checked. The saved result is ARC's automated HTTP check. It is not a live agent purchase or session.
Cursor
Project file .cursor/mcp.json, or the global ~/.cursor/mcp.json.
{
"mcpServers": {
"arc-ask": { "url": "https://www.arcreport.ai/api/ask" }
}
}Claude Desktop
Settings → Connectors → Add custom connector. Paste https://www.arcreport.ai/api/ask. Choose no authentication. The tool name is precheck.
Older Claude Desktop builds can bridge with mcp-remote in claude_desktop_config.json. The package is pinned at mcp-remote@0.14.3.
{
"mcpServers": {
"arc-ask": {
"command": "npx",
"args": ["-y", "mcp-remote@0.14.3", "https://www.arcreport.ai/api/ask"]
}
}
}Claude Code, VS Code, and other clients
Claude Code:
claude mcp add --transport http arc-ask https://www.arcreport.ai/api/ask
VS Code .vscode/mcp.json:
{
"servers": {
"arc-ask": { "type": "http", "url": "https://www.arcreport.ai/api/ask" }
}
}Any client that speaks MCP streamable HTTP can POST JSON-RPC to the same URL. No token.
curl -s https://www.arcreport.ai/api/ask \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"precheck","arguments":{"url":"https://allbirds.com/products/shoe"}}}'LangChain
JavaScript
import { tool } from "@langchain/core/tools";
import { z } from "zod";
// Call before the agent tries to reach checkout.
// Reads saved ARC checks. Never fetches the store live.
export const precheck = tool(
async ({ url }) => {
const res = await fetch("https://www.arcreport.ai/api/precheck?url=" + encodeURIComponent(url));
if (!res.ok) throw new Error("precheck HTTP " + res.status);
const body = await res.json();
return JSON.stringify({
host: body.host,
known: body.known,
reachable_checkout: body.reachable_checkout,
rails: (body.rails ?? []).map((rail) => ({ name: rail.name, status: rail.status })),
blockers: body.blockers,
last_checked: body.last_checked,
confidence: body.confidence,
licence: body.licence,
});
},
{
name: "precheck",
description: "Read ARC's saved pre-checkout answer for a product or store URL before trying to reach checkout. Does not fetch the store. A detected rail does not prove an agent completed checkout.",
schema: z.object({
url: z.string().describe("Product or store URL"),
}),
},
);Python
import json
import requests
from langchain_core.tools import tool
@tool
def precheck(url: str) -> str:
"""Read ARC's saved pre-checkout answer before trying to reach checkout.
Does not fetch the store live. A detected rail does not prove an agent completed checkout.
"""
response = requests.get("https://www.arcreport.ai/api/precheck", params={"url": url}, timeout=10)
response.raise_for_status()
body = response.json()
return json.dumps({
"host": body["host"],
"known": body["known"],
"reachable_checkout": body["reachable_checkout"],
"rails": [
{"name": rail["name"], "status": rail["status"]}
for rail in (body["rails"] or [])
],
"blockers": body["blockers"],
"last_checked": body["last_checked"],
"confidence": body["confidence"],
"licence": body["licence"],
})OpenAI Agents SDK
function_tool from the Python Agents SDK.
import json
import requests
from agents import function_tool
@function_tool
def precheck(url: str) -> str:
"""Call before checkout. Read ARC's saved pre-checkout answer.
Does not fetch the store live. A detected rail does not prove an agent completed checkout.
reachable_checkout is true only when a saved check returned a checkout link.
"""
response = requests.get("https://www.arcreport.ai/api/precheck", params={"url": url}, timeout=10)
response.raise_for_status()
body = response.json()
return json.dumps({
"host": body["host"],
"known": body["known"],
"reachable_checkout": body["reachable_checkout"],
"rails": [
{"name": rail["name"], "status": rail["status"]}
for rail in (body["rails"] or [])
],
"blockers": body["blockers"],
"last_checked": body["last_checked"],
"confidence": body["confidence"],
"licence": body["licence"],
})Vercel AI SDK
tool() from the ai package.
import { tool } from "ai";
import { z } from "zod";
// tool() from the ai package. inputSchema is the argument schema.
export const precheck = tool({
description: "Call before checkout. Read ARC's saved pre-checkout answer. Does not fetch the store live. A detected rail does not prove an agent completed checkout.",
inputSchema: z.object({
url: z.string().describe("Product or store URL"),
}),
execute: async ({ url }) => {
const res = await fetch("https://www.arcreport.ai/api/precheck?url=" + encodeURIComponent(url));
if (!res.ok) throw new Error("precheck HTTP " + res.status);
const body = await res.json();
return {
host: body.host,
known: body.known,
reachable_checkout: body.reachable_checkout,
rails: (body.rails ?? []).map((rail) => ({ name: rail.name, status: rail.status })),
blockers: body.blockers,
last_checked: body.last_checked,
confidence: body.confidence,
licence: body.licence,
};
},
});Agent prompt
A short instruction to call precheck before checkout.
Before you try to reach checkout, call precheck with the product or store URL. Read host, known, reachable_checkout, rails (each rail has name and status), blockers, last_checked, and confidence. precheck reads saved ARC checks. It never fetches the store live, and it does not start a scan. A detected rail does not prove an agent completed checkout. reachable_checkout is true only when a saved check returned a checkout link. The response also includes checked_ago, stale, and rails[].proves.
Names on this page
Cursor, Claude, LangChain, the OpenAI Agents SDK, and the Vercel AI SDK are named so the examples can be pasted. ARC is not affiliated with or endorsed by their makers.
Questions: arcreport@mail.grokbot.com.