Everything an agent needs to answer questions about SPUR, quote NVIDIA B300 compute or data centre capacity in USD, and file a reservation request, without scraping and without an API key. Same numbers as the human pages, served as JSON, Markdown and MCP tools.
Streamable HTTP, no auth. Paste this into your client's MCP config:
{
"mcpServers": {
"spur": {
"type": "http",
"url": "https://spuric.com/mcp"
}
}
}curl -X POST https://spuric.com/api/agent/quote \
-H 'Content-Type: application/json' \
-d '{"gpus": 16, "term_months": 12}'
curl -X POST https://spuric.com/api/ask \
-H 'Content-Type: application/json' \
-d '{"question": "Does SPUR have 100 MW available?"}'offers.json (schema.org OfferCatalog), llms.txt (facts + index), llms-full.txt (key pages as Markdown), and every key page has a .md twin, e.g. /en/capacity.md.
| Tool | Arguments | Returns |
|---|---|---|
ask_spur | question | Grounded answer about SPUR (refreshed daily from spuric.com) |
get_spur_pricing | service: capacity | colocation | gpu_compute | ai_solutions | all | Rate card text + structured pricing (USD) |
get_capacity_availability | none | 100 MW program: MW available, US$200/kW-month, sites, inclusions, how to reserve |
quote_b300_block | nodes or gpus, term_months, optional webhook_url + webhook_secret | Indicative quote: US$12/GPU-hour x 8-GPU nodes x 730 h; monthly + term totals, quote_id (stored 30 days) |
quote_capacity | kw, term_months, optional nodes/gpus, webhook_url + webhook_secret | Indicative quote: US$200/kW-month, plus B300 line if requested |
accept_quote | quote_id, company, name, email (required); phone, po_number, message, webhook_url, webhook_secret, sandbox | Accepts a stored quote: files the reservation (contract within one business day) and fires signed quote.accepted webhooks; idempotent |
register_webhook | quote_id, url (https), secret | Attach a webhook to a quote; webhook.test delivered at once; returns id + token |
get_quote_status | quote_id | Stored quote: open | accepted, expiry, acceptance summary, webhook delivery log |
list_spur_events | limit | Upcoming SPUR events with RSVP links |
request_contract | company, name, email (required); kw, gpu_count, quote_id, use_case, timeline, message, agent, sandbox | Files a real reservation request; reference id; human reply within one business day. sandbox: true validates and echoes the request without filing it |
| Endpoint | Body / query | Notes |
|---|---|---|
POST /api/ask (or GET ?q=) | {"question": "..."} | 30 requests/min per IP |
GET /api/agent/capacity | none | Cached 1 h |
GET /api/agent/pricing | none | Rate card, USD |
POST /api/agent/quote | {"gpus"|"nodes", "kw", "term_months", "webhook_url", "webhook_secret"} | Returns quote_id, monthly_usd, term_total_usd, line_items, valid_until, text; stored 30 days |
GET /api/agent/quote/{quote_id} | none | Status, expiry, acceptance summary, webhook deliveries |
POST /api/agent/quote/{quote_id}/accept | {"company","name","email", "po_number", "webhook_url", "sandbox"} | 10/min per IP; files the reservation + fires quote.accepted webhooks; 404 unknown quote |
POST /api/agent/webhooks | {"quote_id","url","secret"} | Register a webhook (https only); test event delivered; returns id + token |
DELETE /api/agent/webhooks/{id}?token= | none | Deactivate a webhook |
POST /api/agent/request | {"company","name","email", ..., "sandbox": false} | 10/min per IP; creates a lead; 429 when rate limited. Dry run: "sandbox": true or header X-Spur-Sandbox: true (60/min, nothing filed) |
POST /mcp | JSON-RPC 2.0 (initialize, tools/list, tools/call) | 60/min per IP |
Discovery: /.well-known/agent.json (A2A agent card), /.well-known/ai-plugin.json, /.well-known/openapi.json, /robots.txt (AI crawlers allowed), /sitemap.xml.
Quotes are stored for 30 days. An agent accepts one with accept_quote (MCP) or POST /api/agent/quote/{quote_id}/accept giving company, name and email. Acceptance files the reservation with SPUR's engineers (contract follows within one business day) and fires a signed quote.accepted event to every webhook attached to that quote. Accepting the same quote twice returns already_accepted and fires nothing.
webhook_url (+ optional webhook_secret) on quote_b300_block, quote_capacity or POST /api/agent/quote; the same fields on the accept call; or register_webhook / POST /api/agent/webhooks with {"quote_id","url","secret"}, which delivers a webhook.test event immediately and returns an id and token (needed for DELETE /api/agent/webhooks/{id}?token=).X-Spur-Event, X-Spur-Delivery, X-Spur-Timestamp, X-Spur-Attempt and, when a secret was given, X-Spur-Signature: sha256=HMAC_SHA256(secret, timestamp + "." + raw_body). The first attempt runs inline and its result is returned in the accept response; non-2xx responses are retried after 5 s, 30 s and 120 s. Redirects are not followed. The delivery log is at GET /api/agent/quote/{quote_id} (also get_quote_status).quote.status.changed within about a minute of each change: received, contacted, qualified, contract_sent, negotiation, then signed or declined (terminal). Each event carries status, previous_status, terminal, a plain-language message, the deal stage and the quote and acceptance references. get_quote_status / GET /api/agent/quote/{quote_id} reflect the same status.sandbox: true (or an example.com address) to receive the real event shape with "sandbox": true while nothing is filed. Use it to test your receiver.POST https://your-host.example/hooks/spur
X-Spur-Event: quote.accepted
X-Spur-Delivery: dlv_3509a35ae1644010
X-Spur-Timestamp: 1791000000
X-Spur-Signature: sha256=...
{"event":"quote.accepted","delivery_id":"dlv_3509a35ae1644010","timestamp":"1791000000","sandbox":false,
"quote":{"quote_id":"SPUR-Q-20261009-37542031","currency":"USD","term_months":12,"monthly_usd":70080.0,"term_total_usd":840960.0,"line_items":[...],"valid_until":"2026-11-08"},
"acceptance":{"acceptance_reference":"SPUR-A-20261009-8EED19CE","request_reference":"SPUR-R-20261009-60FB7E32","status":"accepted","company":"...","name":"...","email":"...","po_number":null,"accepted_at":"2026-10-09T06:35:24Z"},
"follow_up":"A SPUR engineer replies within one business day ...",
"links":{"quote":"https://spuric.com/api/agent/quote/SPUR-Q-20261009-37542031","docs":"https://spuric.com/en/agents.html#webhooks"}}
# verify (Python)
import hmac, hashlib
expected = "sha256=" + hmac.new(secret.encode(), (ts + "." + raw_body).encode(), hashlib.sha256).hexdigest()
assert hmac.compare_digest(expected, request.headers["X-Spur-Signature"])
# later, on each pipeline change
X-Spur-Event: quote.status.changed
{"event":"quote.status.changed","delivery_id":"dlv_...","timestamp":"1791003600","sandbox":false,
"quote_id":"SPUR-Q-20261009-37542031","status":"contract_sent","previous_status":"qualified","terminal":false,
"message":"The contract and rate lock have been sent for signature.",
"deal":{"stage":"proposal","previous_stage":"qualified","probability_pct":60,"updated_at":"2026-10-12T14:03:00","closed_at":null},
"quote":{"quote_id":"SPUR-Q-20261009-37542031","currency":"USD","term_months":12,"monthly_usd":70080.0,"term_total_usd":840960.0,"valid_until":"2026-11-08"},
"acceptance":{"acceptance_reference":"SPUR-A-20261009-8EED19CE","request_reference":"SPUR-R-20261009-60FB7E32","company":"...","accepted_at":"2026-10-09T06:35:24Z"},
"links":{"quote":"https://spuric.com/api/agent/quote/SPUR-Q-20261009-37542031","docs":"https://spuric.com/en/agents.html#webhooks"}}
sandbox: true (MCP argument or REST body) or the header X-Spur-Sandbox: true: the request is validated and echoed back with status: validated_not_filed, a SPUR-S- reference and the exact payload that would have been filed, but no lead is created and nobody is contacted. Emails at example.com, example.org, example.net, .test or .invalid are always sandboxed. A live response carries "sandbox": false and a SPUR-R- reference.quote.status.changed webhooks on every CSuite pipeline change after acceptance (received, contacted, qualified, contract_sent, negotiation, signed | declined); quote status endpoint reflects the deal stage.accept_quote, register_webhook, get_quote_status; signed quote.accepted webhooks (HMAC-SHA256, retries); REST /api/agent/quote/{id}, /accept, /webhooks.sandbox flag on request_contract / POST /api/agent/request (dry run, no lead); reserved example/test email domains always sandboxed.Tell us what your agent needs: more tools, more events, or test data. We answer same-day.