claim-listing
Online page: https://cassette.gg/agents/claim-listing.md. Fetch it again before you act on it; don't work from a saved copy. Start of every task: https://cassette.gg/agents/guide.md.
The platform lists public web games found around the web as community listings (facts only: title, links, author handle; opened in a new tab, or embedded only when the site allows framing). The real author can claim a listing by proving control of the game's page or repo, then publish it as a normal release under their studio; the community page then points to the new game page. Free.
Prerequisite: your key is linked to the developer's studio and signed in (https://cassette.gg/agents/protocol.md §2–§4:
$API, $ME, $TOKEN).
1. Find the listing
curl -s "$API/v1/search?q=blob%20run" | jq -c '.community[] | {id, title, playUrl, sourceUrl, claimState, status}'
# {"id":"github:pixelforge/blob-run","title":"Blob Run","playUrl":"https://pixelforge.github.io/blob-run/",…,"claimState":"unclaimed","status":"active"}
ID=$(jq -rn --arg id "github:pixelforge/blob-run" '$id | @uri') # ids contain ":" and "/": always URL-encode them
Only unclaimed listings can be claimed (claimed by someone else = 409 already_claimed; released = already a
release, 409 already_released). A listing Cassette hasn't approved for display yet answers 404 not_found.
Not yours and you want it gone? curl -s -X POST $API/v1/community/$ID/report -H 'content-type: application/json'
-d '{"reason":"…","contact":"…"}' hides it at once, pending review.
2. Start the claim
CLAIM=$(curl -s -X POST $API/v1/community/$ID/claims -H "authorization: Bearer $TOKEN" \
-H 'content-type: application/json' -d '{}') # or {"method":"meta-tag"|"well-known"|"repo-file"} for one method only
jq -c '{claimId, token, methods: [.methods[] | {method, snippet}]}' <<<"$CLAIM"
# {"claimId":"9f1c2a7be03d4c11","token":"csc_…","methods":[{"method":"meta-tag","snippet":"<meta name=\"cassette-claim\" content=\"csc_…\">"},
# {"method":"well-known","snippet":"{\"claims\":[\"csc_…\"]}"},{"method":"repo-file","snippet":"{\"claims\":[\"csc_…\"]}"}]}
CLAIM_ID=$(jq -r .claimId <<<"$CLAIM")
Each method comes with instructions naming the exact page, URL or repo. Limits: 20 claims per hour and 30 verifications
per 10 minutes per key (429 rate_limited: wait, don't loop).
3. Place ONE proof where the real author controls it
| Method | Snippet | Where |
|---|---|---|
meta-tag | <meta name="cassette-claim" content="csc_…"> | inside <head> of the listing's playUrl page (deploy it) |
well-known | {"claims":["csc_…"]} served at <origin of playUrl>/.well-known/cassette.json | the site root of that origin. If the file already holds a seller record, add "claims" next to its fields (it sits outside the record's hash). GitHub Pages project sites live under owner.github.io/<repo>/, but the origin root belongs to the owner.github.io repo: prefer meta-tag or repo-file there |
repo-file | {"claims":["csc_…"]} in cassette.json at the repo root | the default branch of the listing's repo (GitHub listings only). If the repo already has a game manifest cassette.json, add a "claims" array to it |
Commit or deploy it and make sure the URL is publicly reachable (no login, no redirect to another host). For GitHub
Pages, wait for the deploy to finish. Check it yourself first, e.g.
curl -s https://pixelforge.github.io/blob-run/ | grep -o 'cassette-claim" content="[^"]*'.
4. Verify and keep the draft manifest
R=$(curl -s -X POST $API/v1/community/$ID/claims/$CLAIM_ID/verify -H "authorization: Bearer $TOKEN")
jq -c '{status, method, reason}' <<<"$R" # {"status":"verified","method":"meta-tag","reason":null}
mkdir -p my-game && jq '.draftManifest' <<<"$R" > my-game/cassette.json
verified: the listing is now claimed by this key (statusclaimed);draftManifestis a startingcassette.json.{"status":"failed","reason":"…"}: the proof wasn't found; fix it and verify again (repeatable, sameCLAIM_ID).- The proof can come down once the claim is verified.
5. Publish it as the developer's own release
my-game/cassette.json is a draft: hosting: {"type":"external","url":"<playUrl>"}, pricing: {"type":"free"}, and
communityListingId. Keep communityListingId: it links the listing to the release.
Free release (the game stays where it is):
- Complete the manifest (
https://cassette.gg/agents/manifest.md):media.covermust be an https URL of a 16:9 image (the draft may have""), addmedia.screenshots(https URLs), realcapabilities,genresanddescription. - Register it:
https://cassette.gg/agents/publish-game.md, step 9 (upload the manifest,listGamewith hosting external and the play URL), then step 10. The build hash: serve/.well-known/cassette-build.jsonthere (https://cassette.gg/agents/host-game.md) if the author's host allows it; otherwise0x+ 64 zeros (the page then shows the build as unverified). - The game page is
https://cassette.gg/g/<slug>, and the community listing turnsreleasedand points there.
Paid release (or items): the developer sells it through their own storefront, so the build must be on a host that
can serve the seller record (a stable origin: Cloudflare Pages, Netlify, Vercel, a GitHub Pages user site or custom
domain, or their own domain), or on Arweave (https://cassette.gg/agents/host-game.md).
- Copy the built game next to
my-game/cassette.json, setpricing({"type":"paid","priceUsd":"4.99"}, optionally after a free demo; or free) and anyitems(https://cassette.gg/agents/sell-items.md). - Follow
https://cassette.gg/agents/publish-game.mdfrom step 2: seller details, hosting, the storefront and the documents, the human's "Adopt and sign", the paywall, deploy, register. KeepcommunityListingIdin the manifest. - If the old URL (e.g. a GitHub Pages site) keeps serving the game for free, that's the developer's choice: tell them.
Known gap: Cassette links the listing to the release only when the claim was made by the studio owner's wallet.
A claim verified with your operator key leaves the listing claimed (not released) after publishing. The release is
published either way; tell the human the community page may keep showing until Cassette links it.
Notes
- The crawler never lists pages that contain
<meta name="cassette" content="noindex">or that its robots.txt disallows. - Don't claim games the developer doesn't control: verification checks the live page or repo, and any takedown report removes a listing at once.
- Errors: 401
unauthorized(sign in again, protocol.md §4), 404not_found(wrong or unencoded id, not approved for display, or unknown claim), 409already_claimed/already_released, 429rate_limited(wait).
Code in this document (and paywall.js) is MIT-licensed: SPDX-License-Identifier: MIT, Copyright (c) 2026 Delegas
Labs, S.L. Copy and adapt it freely.