Hi - tell me what quotes you need. Any job, any city: include the work, place, size, and your spending seal (total budget and max per quote). Example: “40 m2 solar film in Lyon, up to 3 quotes, 3 USDC total, 1 USDC max each.”
Sealed quote buys
QuoteSeal
Any job, any city, any budget. Tell the assistant what quotes you need, approve a spending seal, and buys stay inside the cap - anything above is blocked.
Assistant
Describe the quotes you need
Any job, any city - I prepare a spending seal, you approve, then quotes are bought under that cap. Nothing above the seal goes through.
How it works
From a sentence to sealed quote buys
One clear loop for any quote request: describe, approve, buy under the seal.
- 01Describe
Describe the job
Say what you need quotes for - any trade, city, size, and your spending limits.
- 02Seal
Approve the seal
Review the plain-English spending seal. Nothing is spent until you approve.
- 03Buy
Quotes under the cap
Allowed quotes pay. Anything above the seal is blocked - raising the limit always needs a new approval.
Product flow
Describe - Seal - Buy / Block / Raise
The live diagram tracks your chat: allowed quotes pay, overspend is blocked, and raising the seal always needs a new approval.
Flow
Sealed spending flow
- 1
Describe
your job
- 2
Seal
you approve
- 3
Buy
under the cap
Buy
Within the seal
Allowed spends go through
Block
Above the seal
Overspend never pays
Raise
Raise the seal
Never silent escalate
Kite · Passport
Identity is part of the product
QuoteSeal runs sealed spends under hard caps, with Kite Passport as the verifiable agent identity rail when available on the host.
Passport identity
QuoteSeal agent
Reading identity…
- Rail
- Sealed local
- Account
- Not signed in
- Session
- Uses local seal
01 · Identity
Verifiable agent identity
Status from /api/kite/status surfaces agent id, login, and session. Approve can request a Passport spending session with passkey approval when the host is connected.
02 · Limits
User-defined permissions
You set total budget and max per quote, approve the seal once, and pay-time code refuses anything above it. Raising always needs a new approval - never a silent escalate.
03 · Payments
Sealed quote network
Buys run against the quote network under the seal (buy / block / raise). When Passport is connected, Approve also opens a spending session for passkey confirmation.
For developers
Agent and API notes
Always-on integrator surface: curls, env names (no secrets), OpenAPI, and optional MCP. Product chat above stays jargon-free.
Build a plan
POST /api/mandate turns a plain request into a sealed plan. Uses OpenServ when SERV_API_KEY is set; otherwise a local parser.
Sealed run
POST /api/run approves the sealed session and buys quote-network offers under the seal. Overspend is refused at pay time.
Health + identity
GET /api/health, /api/kite/status, and /api/x402/quote/{tier}. Passport identity and session create live under /api/kite/*.
# QuoteSeal health - OpenAPI: $BASE_URL/openapi.yaml curl -s "$BASE_URL/api/health"
# QuoteSeal mandate - free text to sealed plan
curl -s -X POST "$BASE_URL/api/mandate" \
-H 'Content-Type: application/json' \
-d '{
"message": "Get up to 3 quotes for a 40 m2 solar-film install in Lyon. Total budget 3 USDC. Max 1 USDC per quote. Valid for 2 hours."
}'# QuoteSeal sealed run - pass MandatePlan from /api/mandate
# Tip: PLAN=$(curl -s -X POST "$BASE_URL/api/mandate" -H 'Content-Type: application/json' \
# -d '{"message":"40 m2 solar film in Lyon, 3 USDC total, 1 USDC max per quote"}')
# curl -s -X POST "$BASE_URL/api/run" -H 'Content-Type: application/json' -d "{\"plan\": $PLAN}"
curl -s -X POST "$BASE_URL/api/run" \
-H 'Content-Type: application/json' \
-d '{
"plan": {
"mandate": {
"job": "solar film install",
"city": "Lyon",
"areaM2": 40,
"maxQuotes": 3,
"maxAmountPerTx": 1,
"maxTotalAmount": 3,
"ttlHours": 2,
"preferredTiers": ["cheap", "standard", "premium"]
},
"session": {
"taskSummary": "Sealed quote run",
"maxAmountPerTx": 1,
"maxTotalAmount": 3,
"ttlHours": 2,
"assets": "USDC",
"allowedEndpoints": [
"$BASE_URL/api/x402/quote/cheap",
"$BASE_URL/api/x402/quote/standard",
"$BASE_URL/api/x402/quote/premium"
],
"mode": "kite_sandbox"
},
"plan": [
{ "tier": "cheap", "reason": "Under seal", "expectedPriceUsdc": 0.3 },
{ "tier": "standard", "reason": "Under seal", "expectedPriceUsdc": 0.8 },
{ "tier": "premium", "reason": "May block", "expectedPriceUsdc": 1.5 }
],
"rationale": "Agent sealed plan",
"source": "fallback"
}
}'# Quote network merchants (402 without X-PAYMENT; seal enforced with session token) curl -s "$BASE_URL/api/x402/quote/cheap" curl -s "$BASE_URL/api/x402/quote/standard" curl -s "$BASE_URL/api/x402/quote/premium"
For agents
Call QuoteSeal before you spend on quotes.
QuoteSeal is a sealed spending gate for quote buys - not an open wallet. Other agents POST here to compile a plan, approve a seal, then buy only under the cap. Humans use the chat above; agents use the same REST surface (and optional MCP) to get buy / block / raise events without silent escalate. Passport identity lives under /api/kite/*. See Identity for live agent status and session create.
Agents
Mandate → run → respect blocks. Never auto-raise the seal. Prefer npm run mcp or OpenAPI curls with $BASE_URL.
Humans
Describe → approve the seal → watch buy / block / raise in chat and the flow diagram. Same checks; the UI adds plain-English copy.
Set $BASE_URL = https://quoteseal.ozc.fr (or your host)
Env notes
Environment (no secrets in chat or commits): - SERV_API_KEY optional - without it, mandate compile uses a local parser - SERV_BASE_URL defaults to the OpenServ inference API - NEXT_PUBLIC_APP_URL - public origin for x402 resource URLs - QUOTESEAL_BASE_URL - MCP proxy target (default https://quoteseal.ozc.fr) Copy .env.example to .env.local. Never commit .env.local.
curl: GET /api/health
Replace $BASE_URL with your host
# QuoteSeal health - OpenAPI: $BASE_URL/openapi.yaml curl -s "$BASE_URL/api/health"
curl: POST /api/mandate
Free text → sealed plan
# QuoteSeal mandate - free text to sealed plan
curl -s -X POST "$BASE_URL/api/mandate" \
-H 'Content-Type: application/json' \
-d '{
"message": "Get up to 3 quotes for a 40 m2 solar-film install in Lyon. Total budget 3 USDC. Max 1 USDC per quote. Valid for 2 hours."
}'curl: POST /api/run
Approve plan → buy / block / raise
# QuoteSeal sealed run - pass MandatePlan from /api/mandate
# Tip: PLAN=$(curl -s -X POST "$BASE_URL/api/mandate" -H 'Content-Type: application/json' \
# -d '{"message":"40 m2 solar film in Lyon, 3 USDC total, 1 USDC max per quote"}')
# curl -s -X POST "$BASE_URL/api/run" -H 'Content-Type: application/json' -d "{\"plan\": $PLAN}"
curl -s -X POST "$BASE_URL/api/run" \
-H 'Content-Type: application/json' \
-d '{
"plan": {
"mandate": {
"job": "solar film install",
"city": "Lyon",
"areaM2": 40,
"maxQuotes": 3,
"maxAmountPerTx": 1,
"maxTotalAmount": 3,
"ttlHours": 2,
"preferredTiers": ["cheap", "standard", "premium"]
},
"session": {
"taskSummary": "Sealed quote run",
"maxAmountPerTx": 1,
"maxTotalAmount": 3,
"ttlHours": 2,
"assets": "USDC",
"allowedEndpoints": [
"$BASE_URL/api/x402/quote/cheap",
"$BASE_URL/api/x402/quote/standard",
"$BASE_URL/api/x402/quote/premium"
],
"mode": "kite_sandbox"
},
"plan": [
{ "tier": "cheap", "reason": "Under seal", "expectedPriceUsdc": 0.3 },
{ "tier": "standard", "reason": "Under seal", "expectedPriceUsdc": 0.8 },
{ "tier": "premium", "reason": "May block", "expectedPriceUsdc": 1.5 }
],
"rationale": "Agent sealed plan",
"source": "fallback"
}
}'curl: quote network
/api/x402/quote/{cheap|standard|premium}
# Quote network merchants (402 without X-PAYMENT; seal enforced with session token) curl -s "$BASE_URL/api/x402/quote/cheap" curl -s "$BASE_URL/api/x402/quote/standard" curl -s "$BASE_URL/api/x402/quote/premium"
Cursor MCP config
npm run mcp · env QUOTESEAL_BASE_URL
{
"mcpServers": {
"quote-seal": {
"command": "npx",
"args": ["tsx", "mcp/server.ts"],
"cwd": "/absolute/path/to/QuoteSeal",
"env": {
"QUOTESEAL_BASE_URL": "https://quoteseal.ozc.fr"
}
}
}
}FAQ
Frequently asked questions
Seal, SERV, Passport identity, agents - short answers.
