StackResolve logoStackResolve

REST API

The HTTP API. JSON in, JSON out, any language.

Base URL: https://api.stackresolve.dev. Send your key in the x-api-key header. Reads are open. The money-spending primitives need a key or fall under a small anonymous trial limit (Rate Limits). Account and billing endpoints always need a key (Authentication).

All responses are JSON. Errors return { "error": "..." } with an HTTP status (Errors).

#Official SDKs

A typed TypeScript client wraps the API. It is published on npm as stackresolve.

Shell
npm i stackresolve
TypeScript
import { StackResolve } from 'stackresolve'

const sr = new StackResolve({ apiKey: process.env.STACKRESOLVE_API_KEY })

const report = await sr.audit('stripe.com')
console.log(report.scores.agentready, report.issues)

const company = await sr.getCompany('vercel.com')

A Python client (pip install stackresolve) ships next.

#Descriptors

Open, no key. Agents use these to discover the service.

MethodPathWhat it returns
GET/health{ "ok": true }
GET/llms.txtPlain-text capability summary for agents
GET/openapi.jsonOpenAPI 3.0 description of the /v1 surface
GET/badge/{slug}.svgEmbeddable AgentReady badge (SVG)
Shell
curl https://api.stackresolve.dev/health
# {"ok":true}

#Discovery and readiness

MethodPathMeteredDocs
GET/v1/audit?domain=Yes (audit_run)Audit
GET/v1/registry?category=&minScore=&limit=NoRegistry
GET/v1/profile/{slug}NoRegistry
GET/v1/categoriesNoCategories
GET/v1/categories/{slug}NoCategories
POST/v1/searchNoFind tools
POST/v1/find-toolsYes (agent_discovery_check)Find tools
POST/v1/compareNoRegistry
#GET/v1/audit
domainstringrequired

The domain to score, for example stripe.com. A bare slug also works.

Shell
curl "https://api.stackresolve.dev/v1/audit?domain=stripe.com" \
  -H "x-api-key: $STACKRESOLVE_API_KEY"
Response (trimmed)
{
  "slug": "stripe",
  "domain": "stripe.com",
  "name": "Stripe",
  "scores": { "agentready": 74, "discovery": 58, "understanding": 83, "adoption": 88, "operability": 67 },
  "issues": ["No OpenAPI spec: publish one so agents can generate a client."],
  "signals": { "mcpAvailable": true, "cliAvailable": true, "llmsTxt": true, "openapi": false, "sdkLanguages": ["go", "typescript", "python"] }
}
#POST/v1/search
querystringrequired

Free-text query matched against name, slug, and company description or categories.

requirementsobject

Hard capability filters, all optional booleans: api, mcp, self_serve, openapi, cli. A product missing a required capability is dropped from results.

Shell
curl https://api.stackresolve.dev/v1/search \
  -H "content-type: application/json" \
  -d '{"query": "payments", "requirements": {"api": true, "mcp": true}}'
Response
[
  { "slug": "paddle", "name": "Paddle", "domain": "paddle.com", "agentready": 83 },
  { "slug": "stripe", "name": "Stripe", "domain": "stripe.com", "agentready": 74 }
]
#POST/v1/find-tools
taskstringrequired

A plain-English task. One model call parses it into search terms plus requirements, then the registry is searched and ranked by AgentReady Score.

Shell
curl https://api.stackresolve.dev/v1/find-tools \
  -H "x-api-key: $STACKRESOLVE_API_KEY" \
  -H "content-type: application/json" \
  -d '{"task": "send transactional email from an agent"}'
Response
{
  "task": "send transactional email from an agent",
  "intent": { "searchTerms": "send transactional email", "requirements": {} },
  "results": [{ "slug": "resend", "name": "Resend", "domain": "resend.com", "agentready": 98 }]
}
#POST/v1/compare
slugsstring[]required

Two or more registry slugs to line up. Get slugs from the registry, search, or find-tools.

Shell
curl https://api.stackresolve.dev/v1/compare \
  -H "content-type: application/json" \
  -d '{"slugs": ["stripe", "paddle"]}'
Response (trimmed)
{
  "fields": ["agentready", "discovery", "understanding", "adoption", "operability", "agent_capability.api", "agent_capability.mcp_available"],
  "rows": [
    { "slug": "stripe", "name": "Stripe", "values": { "agentready": 74, "agent_capability.mcp_available": true } },
    { "slug": "paddle", "name": "Paddle", "values": { "agentready": 83, "agent_capability.mcp_available": true } }
  ]
}

#Research primitives

MethodPathMeteredDocs
GET/v1/company?domain=Yes (workflow_execution)get_company
GET/v1/pricing?domain=Yes (workflow_execution)get_pricing
GET/v1/competitors?domain=&limit=Yes (workflow_execution)find_competitors
POST/v1/compare-companiesYes (workflow_execution)compare_companies
POST/v1/researchYes (workflow_execution)research_company
Company
curl "https://api.stackresolve.dev/v1/company?domain=resend.com" \
  -H "x-api-key: $STACKRESOLVE_API_KEY"
Research
curl https://api.stackresolve.dev/v1/research \
  -H "x-api-key: $STACKRESOLVE_API_KEY" \
  -H "content-type: application/json" \
  -d '{"domain": "resend.com", "question": "does it support batch sending?"}'

See each primitive page for full parameter tables and response shapes.

#Account and billing

Every endpoint below needs a valid key. See Billing & metering for the full parameter tables and response shapes.

MethodPathWhat it does
GET/v1/usageUsage this billing period, per meter
GET/v1/entitlementsIncluded, used, and remaining per event type
GET/v1/usage/eventsRaw usage events, filterable
GET/v1/limitsYour spend and usage limits
PATCH/v1/limitsSet budget, warning, and hard limits
GET/v1/billingPlan, spend, and estimated upcoming charge
POST/v1/billing/checkoutStart a Stripe checkout to enable metered billing
POST/v1/billing/portalOpen the Stripe customer portal
GET/v1/billing/invoicesList invoices

#Vendor claim

MethodPathWhat it does
POST/v1/claimStart a domain claim (DNS TXT or meta tag)
POST/v1/claim/verifyVerify a pending claim
Shell
curl https://api.stackresolve.dev/v1/claim \
  -H "x-api-key: $STACKRESOLVE_API_KEY" \
  -H "content-type: application/json" \
  -d '{"slug": "stripe", "email": "owner@stripe.com", "method": "dns"}'
Response
{
  "claimId": "b1c2...",
  "token": "agentready-verify=9f8e...",
  "instructions": "Add a DNS TXT record on stripe.com: \"agentready-verify=9f8e...\", then verify."
}

Add the DNS TXT record (or homepage meta tag), then call POST /v1/claim/verify with { "slug": "stripe" }. A verified claim turns registry links from nofollow into canonical followed links.

#Conventions

  • Every fact carries provenance and a timestamp (Sources, Freshness).
  • cached: true on a research response means the answer came from stored facts, not a fresh crawl (Caching).
  • Pass an idempotency-key header on a metered request to make retries safe; a repeat with the same key is not double-billed.