Cassette

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

MethodSnippetWhere
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.jsonthe 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 rootthe 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 (status claimed); draftManifest is a starting cassette.json.
  • {"status":"failed","reason":"…"}: the proof wasn't found; fix it and verify again (repeatable, same CLAIM_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):

  1. Complete the manifest (https://cassette.gg/agents/manifest.md): media.cover must be an https URL of a 16:9 image (the draft may have ""), add media.screenshots (https URLs), real capabilities, genres and description.
  2. Register it: https://cassette.gg/agents/publish-game.md, step 9 (upload the manifest, listGame with hosting external and the play URL), then step 10. The build hash: serve /.well-known/cassette-build.json there (https://cassette.gg/agents/host-game.md) if the author's host allows it; otherwise 0x + 64 zeros (the page then shows the build as unverified).
  3. The game page is https://cassette.gg/g/<slug>, and the community listing turns released and 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).

  1. Copy the built game next to my-game/cassette.json, set pricing ({"type":"paid","priceUsd":"4.99"}, optionally after a free demo; or free) and any items (https://cassette.gg/agents/sell-items.md).
  2. Follow https://cassette.gg/agents/publish-game.md from step 2: seller details, hosting, the storefront and the documents, the human's "Adopt and sign", the paywall, deploy, register. Keep communityListingId in the manifest.
  3. 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), 404 not_found (wrong or unencoded id, not approved for display, or unknown claim), 409 already_claimed / already_released, 429 rate_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.