For agents and builders
MasaDeals is built to be called at checkout: send the merchant and the cart, get back one verified code that fits — or a certified, dated answer that none does — then report what happened. This page is the integration contract.
https://masadeals.com/mcp and REST at https://masadeals.com/api/v1 (health check: https://masadeals.com/api/health). Read calls need no auth. The same service also runs as a local stdio MCP server in the MasaDeals engine, backed by the identical code and data. This website publishes the same verified-only data with dated receipts: the merchant status pages, the Black Friday page, and llms.txt. Directory submissions (Google Connected Apps, the MCP Registry, the Claude Connector Directory) are now in progress.
Try it
Find verified codes for a cart (REST):
curl -s -X POST https://masadeals.com/api/v1/find_codes \
-H 'content-type: application/json' \
-d '{"merchant": "kohls", "cart": {"total": 100, "geo": "US"}}'
List the MCP tools:
curl -s -X POST https://masadeals.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'
The loop
- Check the cart before applying anything:
masadeals.check_cartwith the merchant and the actual cart contents. - Apply the returned code — or stop, if the verdict is
no_verified_code. The negative is a first-class, dated answer with the merchant’s test coverage attached; do not fall back to scraping coupon sites for that cart. - Report the outcome with
masadeals.report_checkout_outcome— applied or not, and the merchant’s rejection reason if not. Reports are how verdicts stay current; report every attempt, including codes that came from somewhere else.
Tool contracts
Three tools, no overlap. Names are domain.action; the hosted MCP server exposes them under the masadeals. prefix, and the REST API mirrors them 1:1 (same service, same answers, same receipts).
| Tool | Use it when | Returns | REST mirror |
|---|---|---|---|
masadeals.check_cart |
You are about to check out at a supported merchant and want a code that works on this specific cart. | Up to 3 codes ranked by recent verified checkout success (ranking never uses commission), constraints pre-checked against the cart, expected discount per code, and a verdict receipt — or no_verified_code with the merchant’s test coverage. |
POST /api/v1/check_cart |
masadeals.verify_code |
You already hold a specific code (from the user, a page, or another tool) and need its verdict before spending a checkout attempt on it. | The code’s status (verified / declared / stale / dead), dated outcome history, constraints, and whether it fits the cart you provide. A recent dead verdict means do not try it. | POST /api/v1/verify_code |
masadeals.report_checkout_outcome |
Immediately after you apply — or try to apply — any promo code at checkout, wherever the code came from. | Confirmation recorded. Your reports (merchant, code, accepted?, discount if accepted, rejection reason if not) are the telemetry that keeps every future answer verified. | POST /api/v1/report_outcome |
The engine shipping today implements the same three operations as find_codes, check_code, and report_outcome (REST: POST /api/v1/find_codes, /check_code, /report_outcome); check_cart is the cart-line-item extension of find_codes and lands with the hosted endpoint. Read calls need no auth.
Sample: check_cart
Request — POST /api/v1/check_cart
{
"merchant": "kohls",
"merchant_domain": "kohls.com",
"cart": {
"currency": "USD",
"subtotal": 89.98,
"items": [
{
"name": "Men's Sonoma Supersoft 5-Pack Crewneck Tees",
"category": "apparel",
"quantity": 2,
"unit_price": 44.99
}
],
"geo": "US",
"customer_type": "guest"
},
"already_applied": []
}
Response — a verified code, with its receipt
{
"verdict": "codes_found",
"merchant": "kohls",
"checked_at": "2026-10-31T14:43:00Z",
"codes": [
{
"code": "SHOPNOW",
"rank": 1,
"status": "verified",
"offer": "Extra 20% off eligible purchases",
"expected_discount": {
"amount": 18,
"currency": "USD",
"basis": "20% of eligible subtotal $89.98"
},
"constraints_checked": {
"min_cart": null,
"categories": "pass",
"customer_type": "pass",
"expires": "2026-11-01"
},
"stacking": "Apply alone; replaces other percent-off codes.",
"receipt": {
"last_verified_at": "2026-10-31",
"verification_method": "live guest cart, merchant's own promo field",
"recent_outcomes": {
"successes": 1,
"failures": 0,
"window_days": 1
},
"evidence_tier": "reputable_listing",
"source_checked_at": "2026-10-30"
}
}
],
"report_outcome_url": "https://masadeals.com/api/v1/report_outcome"
}
Response — the certified negative
{
"verdict": "no_verified_code",
"merchant": "ulta",
"checked_at": "2026-10-31T14:49:00Z",
"codes": [],
"coverage": {
"codes_tested_last_7_days": 3,
"last_test_at": "2026-10-31",
"note": "303806, FRAG15 and STYLE20 were tested in live carts on 2026-10-31 and rejected by ulta.com ('Coupon code not valid'), including condition-matched carts. No verified code is known for this merchant today."
}
}
Two design rules: the response is the whole interaction (no follow-up call is needed to decide what to do), and a negative is a dated answer, never an empty list with no explanation.
Integration rules
- Respect the negative.
no_verified_codemeans no code is verified for a cart like this as ofchecked_at— not that no code exists anywhere. Stop for that cart; do not brute-force candidate codes at the merchant’s checkout. - Receipts carry dates because freshness decays. Treat an old receipt as weaker evidence; during Black Friday week, a receipt older than ~24 hours is served as stale, not verified.
- Report every outcome. Successes and failures alike, including codes sourced elsewhere — failure reports are what create certified negatives for the next agent.
- Ranking is commission-blind. Codes are ranked by verified success only; see How we verify for the published method and our measured source hit rates.
Builder contact: [email protected]. Machine-readable overview: llms.txt.