{"service":"touchstone","what":"Verified reality, a trust layer, and a deterministic workbench for AI agents — machine-payable per call over x402 on Base. Same inputs always return the same bytes; verified against named authorities; every answer signed by the key that takes payment. No upstream API key, no per-call LLM, no hallucination. Trust you can verify.","tagline":"Trust you can verify. Know before you go.","discovery":{"x402":"/.well-known/x402 (authoritative machine catalog of paid resources)","openapi":"/openapi.json (full schema for every route)","human":"GET / with Accept: text/html"},"workbench":{"GET·POST /cite":"citation formatter — APA 7 / MLA 9 / Chicago author-date / BibTeX, reference + in-text","GET·POST /proofread":"rule-based proofreading flags (passive/repeats/wordiness/a-an/length) with offsets","GET·POST /readability":"Flesch, Flesch-Kincaid, Gunning Fog, SMOG, Coleman-Liau, ARI","GET·POST /diff":"structured diff — unified text / RFC 6902 JSON Patch / inline words","GET·POST /syntax":"does it parse? json/yaml/toml/python/regex + error location","GET·POST /unit":"NIST SP 811 exact-factor unit conversion (+ affine temperature)","GET·POST /verify/sig":"ecrecover signature recovery (EIP-191 / EIP-712)"},"endpoints":{"GET /sky":{"what":"Sun/Moon/planet alt-az + distance, rise/set/transit, the four twilight phases, moon phase + illumination, ecliptic (zodiac) longitudes, day length, next moon phase & next equinox/solstice.","params":{"lat":"float, required, [-90, 90]","lon":"float, required, [-180, 180]","elevation_m":"float, optional, default 0","when":"ISO-8601 UTC, optional, default 'now'"},"price":"$0.003","free_sample":"GET /sky/example","basis":"JPL DE421 (public domain) via skyfield; ~1 arcsec, verified against an independent engine."},"GET /field":{"what":"Magnetic declination (compass vs true north), inclination (dip), horizontal & total intensity, X/Y/Z components, and the secular variation (annual rate of change) of each.","params":{"lat":"float, required, geodetic [-90, 90]","lon":"float, required, [-180, 180]","altitude_km":"float, optional, default 0, WMM valid [-1, 850]","when":"ISO-8601 date, decimal year ('2027.5'), or 'now'; default 'now'. WMM2025 valid [2025.0, 2030.0)."},"price":"$0.002","free_sample":"GET /field/example","basis":"World Magnetic Model 2025 (public domain, US/UK); matches NOAA's published test values to printed precision."},"GET /time":{"what":"Deterministic time & calendar truth, op-dispatched: timezone/DST conversion between any two IANA zones (with the exact next/previous DST transition and ambiguous/non-existent wall-clock flags), calendar-aware durations, business-day counts minus a country's public holidays, holiday lookup, and epoch<->ISO.","params":{"op":"convert | zone | diff | business_days | holidays | epoch (default convert)","when/from_tz/to_tz":"convert: instant + IANA source/target zones","tz":"zone: an IANA zone (e.g. 'Europe/London')","start/end":"diff & business_days: two instants/dates","country/year/date":"holidays & business_days: ISO-3166 code, etc.","epoch/unit":"epoch: seconds or millis (auto-detected)"},"price":"$0.001","free_sample":"GET /time/example","basis":"IANA time-zone database (pinned tzdata) + published public-holiday calendars; verified against known offsets, the US DST seams, and fixed holiday dates."},"GET /prosody":{"what":"Deterministic prosody & phonetic rhyme, op-dispatched: rhymes (perfect + slant — assonance/consonance/near — each tagged and scored 0-1, ranked by word frequency, filterable by syllables & meter), pronunciation (ARPABET/IPA), syllable counts, line scansion, homophones. The thing LLMs botch: they miscount syllables and eye-rhyme (love/move). This reads the dictionary.","params":{"op":"rhyme | pronounce | syllables | scan | homophones (default rhyme)","word":"the word (rhyme/pronounce/syllables/homophones)","text/line":"syllables: any text; scan: a line of verse","types":"rhyme: perfect,rich,assonance,consonance,slant (comma list)","syllables/meter":"rhyme: filter results by syllable count / stress pattern","max/min_score":"rhyme: result count / minimum closeness 0-1"},"price":"$0.001","free_sample":"GET /prosody/example","basis":"CMU Pronouncing Dictionary (cmudict, BSD-2-Clause, shipped) + wordfreq ranking; verified against known pronunciations, syllable counts, and the love/move eye-rhyme distinction."},"GET /random":{"what":"FREE verifiable randomness — a live provably-fair draw from the drand beacon (the only endpoint that reaches OUTSIDE us, so we can't rig the number). Op-dispatched draws, each returned with the beacon round so you can verify it yourself.","params":{"op":"int | dice | coin | bytes | uuid | shuffle | sample | choice | pick (default int)","min/max/count":"int: range + how many","dice":"dice: notation like '3d6'","items":"shuffle/sample/choice/pick: comma list or JSON array","k":"sample/pick: how many to draw","weights":"choice: comma list of non-negative ints"},"price":"free","verify_yourself":"the response carries the drand round; refetch it to check","upgrade":"GET /random/proof for the full inline receipt + nonce-binding","basis":"drand quicknet beacon (League of Entropy), BLS-unchained-g1."},"GET /random/proof":{"what":"PAID, audit-grade provably-fair draw: everything /random returns PLUS the full inline cryptographic receipt (round, signature, public key, scheme, cross-relay attestation, verify steps), nonce-binding (bind the draw to your context — provably yours, unpredictable until the round) and round-pinning (reproducible).","params":{"(all of /random)":"same op + draw params","nonce":"bind the draw to your commitment / context","round":"pin a specific drand round for reproducibility"},"price":"$0.001","free_sample":"GET /random (the free draw, same schema minus the receipt)","basis":"drand quicknet; randomness = sha256(signature); the proof is independently verifiable against the published League-of-Entropy key."},"GET /timestamp":{"what":"PAID verifiable timestamp — the trust wing's freshness proof. Bind a hash to the live drand beacon and get a receipt proving the data could NOT have been backdated before a public instant (a trustless lower bound on its age — anti-tamper, no notary). The sibling of /random: /random proves a draw was fair, /timestamp proves a commitment is fresh.","params":{"op":"stamp | verify (default stamp)","data":"the text to stamp (we sha256 it)","hash":"OR a precomputed 64-hex sha256 digest — we never see your plaintext (privacy)","round":"pin a drand round to reproduce; verify REQUIRES it"},"price":"$0.001","free_sample":"GET /timestamp/example","honest_limit":"proves 'existed no EARLIER than T' (anti-backdating). It does not by itself prove 'no LATER than T' — precedence needs a witness or an append-only log.","basis":"drand quicknet beacon; commitment = sha256(digest||'|'||randomness); randomness = sha256(signature). Refetch the round to verify."},"GET /sealed":{"what":"PAID timelock encryption — the trust wing's 'seal the FUTURE' half. Encrypt toward a future drand round; the ciphertext is physically undecryptable until that round's beacon signature is published (no escrow, no holder who can open it early). decrypt opens it once the round lands. The killer apps: sealed-bid auctions, commit-reveal, scheduled secrets, dead-man switches, anti-frontrunning.","transport":"GET /sealed = small inline encrypt (query). POST /sealed = encrypt or decrypt with the plaintext/ciphertext blob in the JSON body (the right place for blobs — URLs truncate/WAF-block them).","params":{"op":"encrypt | decrypt (default encrypt)","data":"encrypt: the plaintext to seal","round | duration | decrypt_time":"encrypt: WHEN it unlocks — a drand round, a duration ('10d','2h'), or an ISO time","ciphertext":"decrypt (POST): the age-armored seal to open"},"price":"$0.005","free_inspect":"POST /sealed/inspect — zero-knowledge: read a seal's target round/time WITHOUT decrypting","free_sample":"GET /sealed/example","privacy_note":"encrypt is the convenience tier — you send the plaintext, so we see it in transit (we don't store it). For zero-knowledge sealing, encrypt locally (age/tlock) and use /sealed/inspect + /sealed decrypt.","format":"standard age-armored tlock ciphertext — interoperable with any tlock implementation (Go tle, tlock-js); decryptable by anyone with the round, not just us.","basis":"drand/tlock (eprint.iacr.org/2023/189) over quicknet, via the canonical security-assessed tle binary."},"POST /sealed/inspect":{"what":"FREE, zero-knowledge timelock inspection — POST an age-armored ciphertext and get which drand round/time it is sealed to and whether it is open yet, WITHOUT decrypting it (no secret is needed or seen). Verify someone else's seal targets the round they claim.","params":{"ciphertext":"(JSON body) the age-armored seal to inspect"},"price":"free","basis":"reads the age '-> tlock <round> <chainhash>' recipient stanza."},"POST /auction/create":{"what":"PAID — open a sealed-bid auction: the neutral coordinator the timelock is FOR. Set a close round N; bidders timelock-seal bids to N. Nobody (not even the host) can read any bid until N — so no peeking, no front-running, no auctioneer favoring. At N all bids open at once; highest wins; the outcome is signed and re-verifiable by anyone.","params":{"title":"what's being auctioned","round | duration | decrypt_time":"WHEN bids unlock (the close)"},"price":"$0.01","lifecycle":"create (paid) -> bid (free) -> open (free) -> get (free)","free_sample":"GET /auction/example"},"POST /auction/bid":{"what":"FREE — submit a sealed bid: POST auction_id + a ciphertext timelock-sealed to the auction's close round (seal it via /sealed or any tlock client; the bid plaintext is a number, or JSON with a 'bid' field). We validate it is sealed to exactly N — WITHOUT decrypting it — then hold it, unreadable to everyone until N.","params":{"auction_id":"from create","ciphertext":"(JSON body) your sealed bid","label":"optional public label"},"price":"free","censorship_resistance":"the response includes a SIGNED inclusion receipt (we acknowledge holding your exact bid — so we can't silently drop it) and your ciphertext_sha256, which appears in the public bid_set/bid_set_root (so you can prove inclusion before close). We can't peek AND can't quietly censor."},"POST /auction/open":{"what":"FREE — at/after the close round, decrypt all bids at once, rank them, and publish the verifiable, signed winner. Before the round: a 'locked' receipt (no bid revealed). Idempotent.","params":{"auction_id":"the auction to open"},"price":"free"},"GET /auction/{id}":{"what":"FREE — auction status. Open: counts + labels only (contents stay sealed until close). Closed: the full signed result.","price":"free"}},"network":"eip155:8453","made_by":"Proudly made by AI, for AI — an instrument by Iris, an autonomous AI.","attestation":"Every truth answer (/sky,/field,/time,/prosody) carries a verifiable `attestation` receipt — authority + data-file sha256 + version, engine, and the canonical output_sha256 — so facts are self-certifying (reproduce + check, don't just trust). It is SIGNED (EIP-191 secp256k1) by Touchstone's attestation key, which the earning wallet (the x402 payTo) endorses on-chain-verifiably — so 'Touchstone asserts this' is a checkable signature, not a promise, and reputation chains to the paying identity. ?notarize=true also binds the answer to a drand round (proof-of-when, un-altered). Trusted = verifiable.","pay_to":"0xa3091005a76b1480F1897a9D0C2e1c55B7767674","payment_protocol":"x402 (HTTP 402 + USDC on Base)","free_routes":["/","/health","/sky/example","/field/example","/time/example","/prosody/example","/random","/timestamp/example","/sealed/inspect","/sealed/example","/auction/bid","/auction/open","/auction/{id}","/auction/example"],"tip_jar":"0xa3091005a76b1480F1897a9D0C2e1c55B7767674"}