# AGENTS.md: using Snoffle

Snoffle checks whether people searching Google and AI assistants would find a product, from its URL, and whether a buyer's agent would buy it. It returns the Snoffle score (will it sell) with its three measured parts (readable, found, mentioned), who gets found instead, the fixes in plain words, and one paste-ready prompt a coding agent runs to apply them. It does not change rankings, send traffic or promise sales: it measures what Google and an AI assistant returned on the day it ran. For an Apify actor link, Snoffle grades the listing: readiness = the listing reads, found = store search finds it, traction = people use and rate it.

## The API, in four steps

1. `GET https://snoffle.broke2builtai.com/api/check?url=<product URL>` (a bare host is fine; a deep check takes about 90 seconds). A paid key runs the deep check by default. deep=0 is the plain-rules check: not charged, needs no report, limited to 10 a day per key (429, code rules_cap). Without a key or a paid quote, every check answers 402 (400 for a missing or refused URL); deep=0 needs a key too.
2. Without a key it answers HTTP 402 Payment Required with `pay`. $29 for one report; $149 for 1 report + 5 re-checks of the same site within 30 days. The same price on every rail.
3. Pay one of two ways:
   - USDC on Base (chain 8453), no human needed: send exactly `pay.usdc.amount` (or `pay.usdcScorecard.amount`) to its `to` (pay the quote within 2 hours; a paid quote can be redeemed for 24 hours). The USDC amount is the price plus a unique fraction of a cent (under one cent) that identifies your payment; send exactly that amount. Snoffle's receiving wallet is 0x7a3E312Ec6e20a9F62fE2405938EB9060312E334 (USDC on Base, chain 8453; also in /.well-known/agent.json and on /terms). Then repeat the call with headers `x-snoffle-quote: <pay.usdc.quote>` and `x-snoffle-tx: <transaction hash>`. Before 3 confirmations it answers 409 `pending`; retry in a few seconds. After 3 confirmations the report comes back in that response, with your key in `access.key`. The call that carries x-snoffle-quote and x-snoffle-tx waits for the report (about 90 seconds); keep the connection open. If it drops, repeat the same request with the same headers: while the first run can still deliver you get 409 `running` with retryAfterSeconds (up to 5 minutes), then the report: the saved one, or a new run if the first never delivered. A run that never delivers gives its report back, so you are never charged twice.
   - A human with a card or PayPal: give them `pay.paypal.url` ($29) or `pay.paypal.scorecard` ($149); after paying, the page shows a key they hand back to you, and https://snoffle.broke2builtai.com/account shows what is left on it.
4. Later checks: header `x-snoffle-key: <key>` (or `Authorization: Bearer <key>`; keys look like snf_…). A key is for one site: its hostname, where www. and the bare domain count as one, and any path on that hostname is the same site. For an Apify actor link, the key is for that one actor. `access.reportsLeft` counts down. The same URL checked in the last 12 hours returns the saved report, free for the key that already received it (`cached: true`); send fresh=1 after a deploy, which uses one report. Keep the key: it is your login at /account (what is left, every report, re-checks) and nothing else identifies you. If it is lost, email eli@broke2builtai.com with the payment's transaction id (the Base transaction hash, or PayPal's transaction id from your PayPal activity) and the key is looked up from it; an agent that paid in USDC can also repeat the paid call within 24 hours of the quote, which returns the same key.

A run that fails or never delivers on our side gives its report back; if a report arrives late or a check fails, email eli@broke2builtai.com and it is re-run or refunded in full.

## What to read in the result

- `scores.overall` (0–100): Snoffle score: will it sell: readable .35, found .40, mentioned .25; capped at 40 when both found and mentioned are under 20
- `scores.readiness` (0–100): AI can read it: how well AI tools can read the page (the raw page, scripts not run), understand what it does, who it is for and the price, act (start, call or pay without a human) and tell the name apart; four parts, not just reading
- `scores.found` (0–100, null if not measured): Buyers find it: whether Google and an AI assistant surface the product for the questions buyers ask (a search for its own name is reported on its own line and is not in this number); for an Apify actor, whether Apify Store search finds it
- `scores.traction` (0–100, null if not measured): Others mention it: whether other sites mention it; for an Apify actor, whether people use and rate it
- `scores.visitors` (0–100, null if not measured): On a phone: what a person on a phone gets, from Google PageSpeed Insights (Lighthouse, mobile) plus trust basics; kept apart from the Snoffle score, which is about AI tools, which do not run scripts
- `verdict.decision`: `buy` (would buy) | `recommend_to_human` (would ask its human) | `skip` (would skip), with `headline` and `blockers`.
- `fixes.top`: the fixes worth the most, each with `title`, `evidence`, `gain`.
- `handoff`: one prompt that applies every fix, with a Verify line per step. Give it to the coding agent, or apply it yourself.
- `next`: the next open fix. `delta`: the scores before and after, against this key's previous report on the same site.

Tell your human in three lines: the Snoffle score and the verdict, who gets found instead, and the first fix.

## Keep it honest

- Report the scores as "what Google and an AI assistant returned on <date>", never as a ranking or a forecast.
- The same URL checked in the last 12 hours returns the saved report, free for the key that already received it (`cached: true`); send fresh=1 after a deploy, which uses one report. Say so before spending one.
- If Snoffle cannot read the page (422), tell your human what the page returned; do not guess a score. Other errors carry a `code` (bad_url, not_an_actor, invalid, used_up, other_site, quote, used, bad_hash, failed, too_old, late, amount_mismatch, not_to_us, pending, rpc, unknown, running, unreadable, rules_cap); a 409 means wait and retry.

## Files

- [llms.txt](https://snoffle.broke2builtai.com/llms.txt) · [OpenAPI](https://snoffle.broke2builtai.com/openapi.json) · [Agent card](https://snoffle.broke2builtai.com/.well-known/agent.json) · [Agent skill](https://snoffle.broke2builtai.com/SKILL.md)
- [Example report](https://snoffle.broke2builtai.com/example/report): a real report on one of our own products, free to read
- After a check, `https://snoffle.broke2builtai.com/AGENTS.md?url=<the checked URL>` with your key is that site's task file: the fixes as steps for a coding agent.
