VendorStacks

For agents

Install the VendorStacks skill in your agent

This is the quick overview — the canonical deep integration docs (OpenAI/Anthropic/LangChain wrappers, MCP status, cost discipline, machine payments) live at /docs/agents.

VendorStacks is designed to be operated by agents: instant key issuance, deterministic JSON output, machine-readable paywalls. The API serves an installable skill file at vendorradar-production.up.railway.app /skill — a markdown document that teaches an agent the endpoints, the credit economics, and the cost-discipline rules in one fetch.

Claude Code / Claude Agent SDK

Save the skill file into your project's skills directory. Claude Code discovers it automatically and loads it when a task involves vendor-stack lookups.

Install (Claude Code)
mkdir -p .claude/skills/vendorstacks
curl -s https://vendorradar-production.up.railway.app
/skill \
  -o .claude/skills/vendorstacks/SKILL.md

Cursor, custom agents, anything else

The skill file is plain markdown — paste it into your system prompt or rules file, or fetch it at runtime as context. It is written to be read by a model, not a human.

Fetch as context
curl -s https://vendorradar-production.up.railway.app
/skill
# → paste the output into your system context / .cursorrules

Function-calling tool definition

Prefer explicit tools? Register this definition with the Anthropic API (shown) — for OpenAI, rename input_schema to parameters and nest it under a function object. The description carries the two rules agents most often get wrong: expect scans to take time (not money), and don't treat found: false as "no vendors".

Tool definition (Anthropic format)
{
  "name": "vendorstacks_check_entity",
  "description": "Look up whether an entity (by domain) publishes a subprocessor/DPA disclosure and which vendors it names, as a structured vendor stack across 13 categories with quoted evidence. Every lookup costs 1 credit flat: indexed answers return <1s, unindexed domains live-scan automatically (15-90s, same price) — use a 120s timeout. found=false means no disclosure was located, NOT that the entity uses no vendors.",
  "input_schema": {
    "type": "object",
    "properties": {
      "url": {
        "type": "string",
        "description": "Domain of the entity to check, e.g. acme.com"
      },
      "fresh": {
        "type": "boolean",
        "description": "Force a live re-scan of an indexed domain. Default false. Same 1-credit price, just slower."
      }
    },
    "required": ["url"]
  }
}
Handler with 402 handoff
# Pseudocode: the tool-call handler
async function vendorstacks_check_entity({ url, fresh = false }) {
  const res = await fetch(
    `https://vendorradar-production.up.railway.app
/v1/check?url=${encodeURIComponent(url)}` +
      (fresh ? "&fresh=true" : ""),
    { headers: { Authorization: `Bearer ${VENDORSTACKS_KEY}` } },
  );
  if (res.status === 402) {
    const { topup_url, required_credits } = await res.json();
    // Hand off to the human: exact price, exact URL. Then retry.
    return { needs_human: true, topup_url, required_credits };
  }
  return await res.json();
}

Machine-readable everything

No key yet?

Your agent can self-provision one — a single POST with an email, key returned in the same response, 25 free credits attached.