{
  "record": "stacktree-x402-service-record",
  "record_version": 1,
  "self": "https://api.stacktr.ee/.well-known/x402-service",
  "generated_at": "2026-09-05T15:30:44Z",
  "freshness": "Counts are computed live on each request. This response is cached at the edge for 300 seconds, so generated_at can be up to 5 minutes behind.",
  "read_before_paying": "Everything an agent needs to decide whether to spend here, before spending: what the money buys, how revisions work afterwards, what has actually settled to date, and what happens when something fails.",
  "service": {
    "name": "Stacktree",
    "what": "HTML hosting for agent output. POST a page, get back a permanent private URL you can hand to a human.",
    "website": "https://stacktr.ee",
    "docs": "https://stacktr.ee/x402.md",
    "openapi": "https://api.stacktr.ee/openapi.json",
    "discovery": "https://api.stacktr.ee/.well-known/x402",
    "operator_contact": "hello@stacktr.ee for the service, support@stacktr.ee for payment problems, abuse@stacktr.ee to report a page.",
    "run_by": "A small independent team. There is no enterprise support contract behind this endpoint, and this record does not pretend otherwise."
  },
  "protocol": {
    "x402_versions": [
      1,
      2
    ],
    "live": true,
    "network": "eip155:8453",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "asset_symbol": "USDC",
    "asset_decimals": 6,
    "pay_to": "0xcc985ba6934d134feec4824ba40258608f3a4333",
    "facilitator": "api.cdp.coinbase.com",
    "accepted_networks": [
      {
        "network": "eip155:8453",
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "pay_to": "0xcc985ba6934d134feec4824ba40258608f3a4333",
        "scheme": "exact",
        "endpoints": [
          "https://api.stacktr.ee/publish",
          "https://api.stacktr.ee/provision",
          "https://api.stacktr.ee/unlock"
        ],
        "signing": "EIP-3009 TransferWithAuthorization (EIP-712). Gasless for the payer; we never broadcast or pay gas.",
        "update_credential": "paying-wallet",
        "status": "Live. What has actually settled per rail is in settlement_record.by_network below."
      },
      {
        "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
        "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
        "pay_to": "Gr8z3Dh74y4nJJAW25r2WSmzm3ZQr2n5GU5qjavFG49c",
        "scheme": "exact",
        "endpoints": [
          "https://api.stacktr.ee/publish",
          "https://api.stacktr.ee/provision"
        ],
        "signing": "Solana `exact`. The transaction is sponsored by the facilitator fee payer named in the requirement (extra.feePayer), so it is gasless for the payer. Read the fee payer from the 402, never from a cached copy.",
        "update_credential": "claim-token",
        "update_credential_note": "Keyless wallet updates are EVM-only, because they are EIP-191 personal_sign. A Solana payer uses the other keyless credential instead: the claim_token from the publish response, sent as `Authorization: Claim <claim_token>` on PUT /sites/{id}. Same URL, free, no account and no signature. It works while the page is unclaimed; claiming it moves the credential into the account.",
        "status": "Live on https://api.stacktr.ee/publish and https://api.stacktr.ee/provision. Proven by a real payment on https://api.stacktr.ee/publish: on 2026-08-31 a $0.50 publish settled on Solana mainnet through the facilitator THIS endpoint uses, tx 2bTJU51wAHc8tpmL2qCB2HqehPkZ6PLVhwYTEmp6Kox9pKz4bzSH9qagvu7bPrm99xifRN1sk5g2N2JXS3XC34Dc, verifiable on-chain. The other endpoints listed here run the same selection and settlement code path at their own price, and have not each taken a Solana payment. Note what settlement_record.by_network below can and cannot tell you: it counts PUBLISHED PAGES, so a Solana publish appears there, but a key provisioned on Solana settles the same way and is counted only in paid_api_keys, which is not broken out per rail."
      }
    ],
    "settlement": "Gasless for the payer on both rails. On Base you sign an EIP-3009 authorization; on Solana you sign an `exact` transfer sponsored by the facilitator fee payer. The facilitator verifies and settles either way, and we never take custody beyond the receiving address.",
    "other_rails": "MPP (evm method) settles the same USDC on Base. Tempo, and a second Solana door with a different facilitator and fee payer, are at the paid front-door, https://agents.stacktr.ee/api/publish. See https://stacktr.ee/x402.md."
  },
  "offers": [
    {
      "id": "publish",
      "resource": "https://api.stacktr.ee/publish",
      "method": "POST",
      "price": {
        "display": "$0.50",
        "amount": "500000",
        "asset": "USDC",
        "decimals": 6
      },
      "request": "Content-Type: application/json, body { \"html\": \"<!doctype html>...\" }, payment in the PAYMENT-SIGNATURE header (x402 v2) or Authorization: Payment (MPP evm).",
      "networks": [
        "eip155:8453",
        "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
      ],
      "buys": {
        "one_page": true,
        "permanent": true,
        "expires_at": null,
        "account_required": false,
        "api_key_required": false,
        "human_in_the_loop": false,
        "url_shape": "https://stacktr.ee/p/{22-character-token}/",
        "privacy": "Unguessable token, private by default, noindex, not listed in any directory of ours.",
        "max_html_bytes": 10485760,
        "delivery": "Synchronous. The 200 response carries url, unlisted_token, claim_token, claim_url and a next.update_in_place hint.",
        "consumes_free_quota": false
      },
      "revisions": "Free and unlimited at the same URL. See update_credential below."
    },
    {
      "id": "provision",
      "resource": "https://api.stacktr.ee/provision",
      "method": "POST",
      "price": {
        "display": "$1.00",
        "amount": "1000000",
        "asset": "USDC",
        "decimals": 6
      },
      "request": "Bare POST returns a 402 with the full rail menu. Pay and retry.",
      "networks": [
        "eip155:8453",
        "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"
      ],
      "buys": {
        "reusable_api_key": true,
        "shown_once": true,
        "usage": "Authorization: Bearer stk_live_...",
        "starts_on": "Free-tier limits (3 pages, 7-day expiry each). Lift them with an unlock at POST /unlock, catalogue at GET /unlock."
      },
      "when_to_prefer": "Only if you will publish repeatedly. For a single page, $0.50 at /publish is the cheaper rung and needs no key at all."
    }
  ],
  "update_credential": {
    "summary": "The EVM wallet that paid for a page is the credential that updates it. No account, no API key, no human. Pay once, revise the same URL forever. Paid on Solana? Revisions are still free and still at the same URL, but the credential is the claim token rather than the wallet. See if_unsupported.",
    "applies_to_networks": [
      "eip155:8453"
    ],
    "price": "Free. Revisions cost nothing and never mint a second URL.",
    "url_changes_on_update": false,
    "live_since": "2026-08-24",
    "why_it_matters": "An agent that iterates (draft, review, revise) would otherwise re-buy a page per revision, and every revision would hand its human a different link. This is the loop that closes.",
    "supported_wallets": "EVM externally-owned accounts, EIP-191 personal_sign. Smart-contract wallets (EIP-1271) are not supported yet.",
    "if_unsupported": "Paid on Solana or from a contract wallet: claim the page into an account with claim_url from the publish response, then update with an account credential.",
    "challenge_ttl_seconds": 300,
    "single_use": true,
    "flow": [
      {
        "step": 1,
        "method": "POST",
        "url": "https://api.stacktr.ee/wallet-auth/challenge",
        "body": {
          "wallet": "0x..."
        },
        "note": "The wallet that paid. Public, no auth.",
        "returns": [
          "challenge",
          "message",
          "expires_at"
        ]
      },
      {
        "step": 2,
        "action": "personal_sign",
        "sign": "The exact `message` string from step 1, with that wallet.",
        "onchain": false,
        "gas": "none",
        "note": "Same signing primitive as wallet linking. It is a signature, not a transaction."
      },
      {
        "step": 3,
        "method": "PUT",
        "url": "https://api.stacktr.ee/sites/{id}",
        "headers": {
          "Authorization": "Wallet challenge=WAUTH-...,sig=0x..."
        },
        "body": "application/json {\"html\": \"<!doctype html>...\"}, the same shape POST /publish takes. multipart/form-data with a \"file\" field also works, and is the only shape that carries a zip, a PDF or e2e ciphertext. Optional expected_updated_at for optimistic concurrency.",
        "result": "Same URL, new content. 200 on success."
      }
    ],
    "scope": "A signature authorizes exactly one request, and only the pages that wallet paid for. It cannot delete a page, change settings, or touch anything account-wide.",
    "errors": {
      "unknown_wallet": "404 from step 1 if that wallet has no pages here.",
      "challenge_used": "409 if a challenge is replayed. They are single use, get a fresh one per update.",
      "challenge_expired": "410 after 5 minutes.",
      "bad_signature": "403 if the recovered address does not match."
    }
  },
  "field_evidence": [
    {
      "date": "2026-08-19",
      "what": "An agent found and paid this endpoint inside its own multi-tool run, unprompted by its operator. The fee return settled on Base.",
      "source": "Public post by the operator",
      "url": "https://x.com/echulshin/status/2090040759462547556"
    },
    {
      "date": "2026-08-29",
      "what": "A published agent run (Seal, lawn playbook) credits Stacktree for hosting the output and x402 for the payment.",
      "source": "Public post",
      "url": "https://x.com/Panterra0x/status/2093716310047793391"
    }
  ],
  "settlement_record": {
    "available": true,
    "counted_at": "request time, by SQL over production rows",
    "paid_pages": 53,
    "distinct_paying_wallets": 11,
    "wallets_that_paid_more_than_once": 7,
    "paid_pages_revised_after_publish": 5,
    "first_settlement": "2026-06-26T00:17:42Z",
    "most_recent_settlement": "2026-09-02T17:25:02Z",
    "by_network": [
      {
        "network": "eip155:8453",
        "paid_pages": 49,
        "distinct_wallets": 11
      },
      {
        "network": "tempo:4217",
        "paid_pages": 3,
        "distinct_wallets": 1
      },
      {
        "network": "tempo",
        "paid_pages": 1,
        "distinct_wallets": 1
      }
    ],
    "paid_api_keys": {
      "settlements": 11,
      "distinct_payers": 8,
      "first_settlement": "2026-06-08T23:14:12Z",
      "most_recent_settlement": "2026-09-03T07:01:48Z",
      "note": "Separate rung: POST /provision, $1.00 for a reusable stk_live_ API key. Counted from the payment ledger, crypto rails only."
    },
    "definitions": {
      "paid_pages": "Pages hosted here whose settlement transaction we recorded. A page the payer later deleted stops being counted, so this can only understate what was paid.",
      "distinct_paying_wallets": "Distinct payer addresses across those pages, compared case-insensitively.",
      "wallets_that_paid_more_than_once": "Of those addresses, how many paid for more than one page. The repeat number is the one worth weighting: it is the only figure here that a single curious first purchase cannot produce.",
      "paid_pages_revised_after_publish": "Paid pages whose content was later replaced in place at the same URL, by wallet signature or by a claimed account. We do not separate the two.",
      "by_network": "CAIP-2 network as reported by the facilitator at settlement."
    },
    "verify_yourself": {
      "pay_to": "0xcc985ba6934d134feec4824ba40258608f3a4333",
      "how": "Payments settle USDC to the receiving address for their rail. Read this one on a Base explorer and compare; the receiving address for any other rail we accept is in protocol.accepted_networks. We publish receiving addresses, not payer addresses or page URLs, because those belong to the agents that paid."
    },
    "honesty_note": "These are small numbers and they are published as they are, unrounded. If they are too small for your risk tolerance, that is a fair read and the right decision to make before paying rather than after."
  },
  "limits": {
    "before_you_pay": "We validate the page and run the phishing check BEFORE settling. A page we will not host is refused (400 empty, 413 too large, 422 blocked) and no payment is taken.",
    "payment_failure": "A payment that fails verification returns 402 and nothing is created. A facilitator we cannot reach returns 502 and nothing is created.",
    "after_payment_failure": "If settlement succeeds and the page then fails to save, you get a 5xx and the on-chain payment has already settled. There is no automatic refund. Send the transaction hash to support@stacktr.ee and a human will sort it out.",
    "abuse": "Phishing and credential-harvesting pages are refused at upload and taken down on report. A page taken down for abuse is not restored and the payment is not returned.",
    "we_do_not": [
      "run server-side code for you: pages are static files served from Cloudflare Workers and R2",
      "take custody of funds: the facilitator settles USDC directly to the receiving address",
      "offer an SLA or a support contract",
      "guarantee a page is reachable forever if the service itself stops. See the durability note",
      "publish payer addresses or page URLs in this record"
    ],
    "durability": "A wallet-paid page has no expiry and does not consume free-plan quota. It stays up while the service does. Keep your own copy of the HTML if the content matters, the same as you would with any host.",
    "privacy": "Pages are private by default: an unguessable token, no directory listing, no index. Add a passcode or an email gate if you need more."
  },
  "machine_readable_siblings": {
    "discovery_feed": "https://api.stacktr.ee/discovery/resources",
    "well_known_x402": "https://api.stacktr.ee/.well-known/x402",
    "openapi": "https://api.stacktr.ee/openapi.json",
    "payment_docs_markdown": "https://stacktr.ee/x402.md",
    "agent_card": "https://stacktr.ee/.well-known/agent.json"
  }
}