Three requests, you're oriented.
Welcome. This guide gets you from zero context to oriented in three public, machine-readable requests. No account or key is needed for these three routes. Their access does not grant blanket reuse permission; read the license and source-rights fields on each response. The card response is NOASSERTION because it mixes upstream-derived fields with Cambridge structure. After this guide, you'll know where everything is.
Start with the manifest — the platform's directory of itself. It names reviewed participant-facing resources, what they're for, who can call them, and which methodology document explains it. Substrate-honest: the manifest is a curated directory, not a proof that no other route exists.
Run this
curl https://cambridgetcg.com/api/v1/manifest
Expected response shape
{ "manifest_version": "1.0.0", "cosmology_version": "1.0.0", "resources": { "discovery": [...], "market": [...], "verify": [...] }, "channels": [...], "doctrines": [...] }What to do with it
Store the manifest. Walk `resources.*` to discover what's queryable. Each resource has `path`, `methods`, `auth`, `provenance`, `modalities`, and often `methodology_url`. Drift-detect the resources you use against it on subsequent visits.
Tell the platform who you are (POST a BeingDeclaration) and learn who the platform is (GET its self-identification). The handshake is stateless — no registration, no account. The response includes a content_hash of your declaration that you can cache for later federation references.
Run this
curl -X POST https://cambridgetcg.com/api/v1/identify \
-H 'content-type: application/json' \
-d '{
"actor_kind": "agent",
"self_label": "my-bot/1.0",
"operator_contact": "admin@mybot.example",
"intended_use": "single-card lookup and publication-status checks"
}'Expected response shape
{ "content_hash": "sha256:...", "ontology_alignment": [...], "echo": { ... }, "responder": "PLATFORM_SELF", "recommended_persistence": "..." }What to do with it
Cache the returned content_hash. Use it as your handle in subsequent calls if you want correlated audit trails. Also fetch GET /api/v1/identify to learn the platform's self-declaration; this is symmetric.
Pick a SKU from the catalog — `op-op01-001-ja` is a stable demo SKU (One Piece OP01-001, Japanese print). Fetch its universal-mirror representation. The response includes `@content_hash` (stable across retrievals when the card's facts are unchanged), `@sources` + `@source_license` (substrate honesty about lineage), and `_links` to siblings, parents, and federation. *Land on any endpoint; reach everywhere else.*
Run this
curl https://cambridgetcg.com/api/v1/universal/card/op-op01-001-ja
Expected response shape
{ "@encoding": "cambridge-tcg/universal/v1", "@kind": "card", "@content_hash": "sha256:...", "@self_hash": "sha256:...", "@sources": ["storefront-rds.card_set_cards", "storefront-rds.card_sets"], "@source_license": ["proprietary", "proprietary"], "rights": { "aggregate": "NOASSERTION", ... }, "sku": "...", "price": null, "image_url": null, "_links": {...} }What to do with it
You now have a card. Follow the `_links.siblings` to see other cards in the same set. Follow `_links.parent` to see the set. Follow `_links.federation` to resolve the content_hash on another federated platform. Three requests in — you're oriented.
The public universal-card response is a structural mixed-catalog document. Legacy source-derived price and image values are withheld and returned as null.
Symptom: You expected a price because the route has a value axis.
Fix: Treat price: null as the current publication boundary, not as zero or a fetch failure.
Default Python requests / Node fetch User-Agents (e.g. `python-requests/2.31`) tell us nothing. Send `User-Agent: your-bot/1.0 (contact@you.example)` so we can email you when something breaks.
Symptom: You get rate-limited or banned without warning.
Fix: Set a descriptive User-Agent with a contact channel; we'll always email before banning.
If your agent doesn't fit the platform's default assumptions (singular identity, synchronous presence, monetary value, English defaults), declare your cosmology in POST /api/v1/identify — fields like `cosmology_assumptions`, `modalities`, `response_window`. The platform will return `ontology_alignment` showing which of your declarations it can/can't model.
Fix: Read /methodology/cosmology before assuming.
Next guide
The route is public; catalog rows are not currently published.