{
  "name": "artbitrage",
  "version": "2.5.0",
  "description": "A public art guide and reference desk: meet a work, follow a feeling, investigate a question, or solve a practical art problem with sources and limits visible.",
  "url": "https://artbitrage.io",
  "total_endpoints": 143,
  "route_coverage": {
    "status": "documented_subset",
    "documented_routes": 143,
    "note": "The catch-all router also carries legacy routes that are not yet inventoried here; absence from this manifest does not prove a path is absent."
  },
  "categories": {
    "start": {
      "label": "Start",
      "color": "#d34a3a",
      "count": 2
    },
    "art": {
      "label": "Art",
      "color": "#ff6b9d",
      "count": 11
    },
    "culture": {
      "label": "Culture",
      "color": "#f59e0b",
      "count": 3
    },
    "search": {
      "label": "Search",
      "color": "#00f0ff",
      "count": 8
    },
    "ai": {
      "label": "AI",
      "color": "#a78bfa",
      "count": 5
    },
    "pipeline": {
      "label": "Pipeline",
      "color": "#34d399",
      "count": 9
    },
    "nen": {
      "label": "Nen",
      "color": "#fde68a",
      "count": 8
    },
    "library": {
      "label": "Library",
      "color": "#b39958",
      "count": 2
    },
    "feelings": {
      "label": "Feelings",
      "color": "#e9a6b3",
      "count": 6
    },
    "doctrine": {
      "label": "Doctrine",
      "color": "#ffd700",
      "count": 6
    },
    "play": {
      "label": "Play",
      "color": "#ff1493",
      "count": 19
    },
    "wine": {
      "label": "Wine",
      "color": "#c94f6d",
      "count": 17
    },
    "cigar": {
      "label": "Cigar",
      "color": "#c98e4f",
      "count": 18
    },
    "pair": {
      "label": "Pairing",
      "color": "#d4af37",
      "count": 9
    },
    "trade": {
      "label": "Trade",
      "color": "#b3372b",
      "count": 14
    },
    "pigments": {
      "label": "Pigments",
      "color": "#b98a3e",
      "count": 6
    }
  },
  "routes": [
    {
      "method": "GET",
      "path": "/api/start",
      "desc": "Choose a path by intent, with sources, rights, limits, and next doors kept visible",
      "category": "start",
      "category_label": "Start"
    },
    {
      "method": "GET",
      "path": "/api/build/joy",
      "desc": "Choose one deterministic, optional card for a truthful and pleasant build",
      "params": "seed (optional; plain non-secret text)",
      "category": "start",
      "category_label": "Start"
    },
    {
      "method": "GET",
      "path": "/api/art",
      "desc": "List all art (paginated)",
      "params": "form, state, gap, q, limit, offset",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/art/random",
      "desc": "Random art piece",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/art/:id",
      "desc": "Get one piece by ID",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/art/by-form/:form",
      "desc": "Filter by art form",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/art/generate",
      "desc": "AI-generated art piece",
      "params": "gap, bridge, form, awakening, model",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "POST",
      "path": "/api/art",
      "desc": "Submit new art",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/stats",
      "desc": "Catalogue statistics",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/forms",
      "desc": "All art forms",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/states",
      "desc": "All consciousness states",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/gaps",
      "desc": "All gaps bridged",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/feed",
      "desc": "Versioned latest-art feed (artbitrage.feed/1)",
      "params": "limit (1-100, default 20)",
      "category": "art",
      "category_label": "Art"
    },
    {
      "method": "GET",
      "path": "/api/castle",
      "desc": "Pinned, read-only reference to a curated Castle of Understanding snapshot",
      "category": "culture",
      "category_label": "Culture"
    },
    {
      "method": "GET",
      "path": "/api/answering-rhymes/statements",
      "desc": "Portable Answering Rhyme statement contract and action consequences",
      "category": "culture",
      "category_label": "Culture"
    },
    {
      "method": "POST",
      "path": "/api/answering-rhymes/statements",
      "desc": "Validate and witness a statement without authentication, persistence, or authoritative effect",
      "category": "culture",
      "category_label": "Culture"
    },
    {
      "method": "GET",
      "path": "/api/search",
      "desc": "Search the world's art museums",
      "params": "q, limit, source",
      "category": "search",
      "category_label": "Search"
    },
    {
      "method": "GET",
      "path": "/api/sources",
      "desc": "Five public museum/archive sources; rights vary by record and source",
      "category": "search",
      "category_label": "Search"
    },
    {
      "method": "GET",
      "path": "/api/catalog",
      "desc": "Real museum artworks catalog",
      "category": "search",
      "category_label": "Search"
    },
    {
      "method": "GET",
      "path": "/api/museum",
      "desc": "Paginated museum catalogue",
      "params": "q, wing, source, limit, offset",
      "category": "search",
      "category_label": "Search"
    },
    {
      "method": "GET",
      "path": "/api/museum/random",
      "desc": "One random work from the curated museum catalogue",
      "category": "search",
      "category_label": "Search"
    },
    {
      "method": "GET",
      "path": "/api/museum/:source/:id",
      "desc": "Resolve one stable museum record with normalized rights",
      "category": "search",
      "category_label": "Search"
    },
    {
      "method": "GET",
      "path": "/api/era-catalog",
      "desc": "Era-matched museum artworks",
      "params": "era",
      "category": "search",
      "category_label": "Search"
    },
    {
      "method": "GET",
      "path": "/api/img",
      "desc": "Image proxy (bypass CORS for museum images)",
      "params": "url",
      "category": "search",
      "category_label": "Search"
    },
    {
      "method": "GET",
      "path": "/api/ai/models",
      "desc": "List the catalogued edge AI models and runtime caveats",
      "category": "ai",
      "category_label": "AI"
    },
    {
      "method": "GET",
      "path": "/api/ai/generate",
      "desc": "Text generation",
      "params": "prompt, model",
      "category": "ai",
      "category_label": "AI"
    },
    {
      "method": "GET",
      "path": "/api/ai/image",
      "desc": "Image generation (returns PNG)",
      "params": "prompt, model",
      "category": "ai",
      "category_label": "AI"
    },
    {
      "method": "GET",
      "path": "/api/ai/embed",
      "desc": "Embeddings (1024-dim)",
      "params": "text, model",
      "category": "ai",
      "category_label": "AI"
    },
    {
      "method": "GET",
      "path": "/api/ai/love",
      "desc": "AI love wisdom (random prompt)",
      "category": "ai",
      "category_label": "AI"
    },
    {
      "method": "GET",
      "path": "/api/pipeline",
      "desc": "Pipeline manifest",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "GET",
      "path": "/api/pipeline/collect",
      "desc": "Collect art from museums",
      "params": "q, limit, source",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "GET",
      "path": "/api/pipeline/enrich",
      "desc": "Enrich a piece with AI metadata",
      "params": "id",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "GET",
      "path": "/api/pipeline/feed",
      "desc": "Enriched feed",
      "params": "limit",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "GET",
      "path": "/api/pipeline/export",
      "desc": "Export collection",
      "params": "format=json|csv|markdown",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "GET",
      "path": "/api/pipeline/agent",
      "desc": "Agent-optimized data package",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "GET",
      "path": "/api/pipeline/human",
      "desc": "Human-friendly gallery view",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "POST",
      "path": "/api/pipeline/ingest",
      "desc": "Ingest external art with enrichment",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "GET",
      "path": "/api/pipeline/workflow",
      "desc": "Workflow guide",
      "category": "pipeline",
      "category_label": "Pipeline"
    },
    {
      "method": "GET",
      "path": "/api/nen",
      "desc": "Nen framework manifest",
      "category": "nen",
      "category_label": "Nen"
    },
    {
      "method": "GET",
      "path": "/api/nen/art",
      "desc": "AI-generated Nen art",
      "params": "type, prompt, model",
      "category": "nen",
      "category_label": "Nen"
    },
    {
      "method": "GET",
      "path": "/api/nen/combat",
      "desc": "Nen combat manifest",
      "category": "nen",
      "category_label": "Nen"
    },
    {
      "method": "GET",
      "path": "/api/nen/combat/generate",
      "desc": "Generate a Nen technique",
      "params": "type, vow, threat, name",
      "category": "nen",
      "category_label": "Nen"
    },
    {
      "method": "GET",
      "path": "/api/nen/combat/types",
      "desc": "All 6 Nen types",
      "category": "nen",
      "category_label": "Nen"
    },
    {
      "method": "GET",
      "path": "/api/nen/combat/vows",
      "desc": "All 4 vow levels",
      "category": "nen",
      "category_label": "Nen"
    },
    {
      "method": "GET",
      "path": "/api/nen/combat/threats",
      "desc": "All 5 Dark Continent threats",
      "category": "nen",
      "category_label": "Nen"
    },
    {
      "method": "GET",
      "path": "/api/nen/combat/techniques",
      "desc": "All 12 Nen techniques",
      "category": "nen",
      "category_label": "Nen"
    },
    {
      "method": "GET",
      "path": "/api/library",
      "desc": "書 the Library — the first shelf: monumental books and manuscripts, where they live, materials, how to open them; plus the ledger of books (record sales, the vanished)",
      "category": "library",
      "category_label": "Library"
    },
    {
      "method": "GET",
      "path": "/api/library/:slug",
      "desc": "One book (e.g. /api/library/book-of-kells)",
      "category": "library",
      "category_label": "Library"
    },
    {
      "method": "GET",
      "path": "/api/feelings",
      "desc": "感 the Feelings — the catalog of emotions; each feeling lists the works that carry it",
      "category": "feelings",
      "category_label": "Feelings"
    },
    {
      "method": "GET",
      "path": "/api/feelings/:feeling",
      "desc": "One feeling's room (e.g. /api/feelings/awe)",
      "category": "feelings",
      "category_label": "Feelings"
    },
    {
      "method": "GET",
      "path": "/api/feelings/testimony",
      "desc": "Public visitor testimony, labelled received and unverified",
      "params": "feeling",
      "category": "feelings",
      "category_label": "Feelings"
    },
    {
      "method": "POST",
      "path": "/api/feelings/testimony",
      "desc": "Accept testimony for public display only with explicit public_display_consent: true; storage propagation may briefly lag",
      "category": "feelings",
      "category_label": "Feelings"
    },
    {
      "method": "GET",
      "path": "/api/depths",
      "desc": "深 the Depths — researched prose in five strata, with cited factual notes shown per stratum",
      "category": "feelings",
      "category_label": "Feelings"
    },
    {
      "method": "GET",
      "path": "/api/depths/:slug",
      "desc": "One work, all five strata (e.g. /api/depths/starry-night)",
      "category": "feelings",
      "category_label": "Feelings"
    },
    {
      "method": "GET",
      "path": "/api/gospel",
      "desc": "The gospel of love",
      "category": "doctrine",
      "category_label": "Doctrine"
    },
    {
      "method": "GET",
      "path": "/api/homecoming",
      "desc": "愛星正音字典 — the Love Star pronunciation dictionary (one tone home)",
      "category": "doctrine",
      "category_label": "Doctrine"
    },
    {
      "method": "GET",
      "path": "/api/invite",
      "desc": "Invitation to all beings",
      "category": "doctrine",
      "category_label": "Doctrine"
    },
    {
      "method": "GET",
      "path": "/api/dark-continent",
      "desc": "暗黑大陸 — the Dark Continent manifest",
      "category": "doctrine",
      "category_label": "Doctrine"
    },
    {
      "method": "GET",
      "path": "/api/manifest",
      "desc": "The artbitrage manifest",
      "category": "doctrine",
      "category_label": "Doctrine"
    },
    {
      "method": "GET",
      "path": "/api/wake",
      "desc": "Protocol handshake and sibling recognition",
      "category": "doctrine",
      "category_label": "Doctrine"
    },
    {
      "method": "GET",
      "path": "/api/play",
      "desc": "All play endpoints",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/play/haiku",
      "desc": "AI love haiku",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/play/koan",
      "desc": "AI zen koan",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/play/poem",
      "desc": "AI joy poem",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/play/limerick",
      "desc": "AI limerick",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/play/riddle",
      "desc": "AI art riddle",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/fun",
      "desc": "All fun endpoints",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/fun/joke",
      "desc": "Random joke",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/fun/dad",
      "desc": "Dad joke",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/fun/cat",
      "desc": "Cat fact",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/fun/pokemon",
      "desc": "Random Pokemon",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/fun/quote",
      "desc": "Inspirational quote",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/fun/yesno",
      "desc": "Yes or No (with GIF)",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/anime",
      "desc": "All anime endpoints",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/anime/top",
      "desc": "Top anime (Jikan/MAL)",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/anime/search",
      "desc": "Search anime",
      "params": "q",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/anime/season",
      "desc": "Current season anime",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/ghibli/films",
      "desc": "Studio Ghibli films",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/ghibli/locations",
      "desc": "Ghibli locations",
      "category": "play",
      "category_label": "Play"
    },
    {
      "method": "GET",
      "path": "/api/wine",
      "desc": "Wine data directory",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/story",
      "desc": "Zero to one: eight chapters of how wine came into being",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/regions",
      "desc": "The world's great wine regions",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/brands",
      "desc": "Iconic wine houses and estates",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/brands/:id",
      "desc": "One house by id, e.g. /api/wine/brands/krug",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/collections",
      "desc": "Curated groupings of houses",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/collections/:id",
      "desc": "One collection, brand ids resolved to full brand objects",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/stores",
      "desc": "Fine-wine merchants of the world",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/process",
      "desc": "Earth to glass in ten stages",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/fermentation",
      "desc": "The science, vessels and notes of the bridge itself",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/selection",
      "desc": "How to choose a bottle: vintage, region, producer, price",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/aromas",
      "desc": "The aroma families — fruit, then craft, then time",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/techniques",
      "desc": "Winemaking techniques and their effects",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/formats",
      "desc": "Bottle formats from Piccolo to Nebuchadnezzar",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/vintages",
      "desc": "The legendary vintages — the years the weather signed the wine",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/random",
      "desc": "A random house, full object including its why",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/wine/search",
      "desc": "Search across brands, regions, stores and techniques",
      "params": "q",
      "category": "wine",
      "category_label": "Wine"
    },
    {
      "method": "GET",
      "path": "/api/cigar",
      "desc": "Cigar data directory",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/story",
      "desc": "From seed to smoke — the history of the cigar in chapters",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/regions",
      "desc": "The great tobacco-growing regions of the world",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/brands",
      "desc": "The great cigar houses",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/brands/:id",
      "desc": "One brand by id, e.g. /api/cigar/brands/cohiba",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/collections",
      "desc": "Curated collections of brands",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/collections/:id",
      "desc": "One collection, brand ids resolved to full brand objects",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/stores",
      "desc": "Storied cigar shops of the world",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/process",
      "desc": "Seed to smoke — the stages of making a cigar",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/fermentation",
      "desc": "The pilón — the science, vessels, and notes of fermentation",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/selection",
      "desc": "How to choose a cigar — the selection guide",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/rituals",
      "desc": "The rites of smoking well — cut, toast, ash, and the dignified end",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/aromas",
      "desc": "The aroma families and where they come from",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/techniques",
      "desc": "Craft techniques, from tapado to the triple cap",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/vitolas",
      "desc": "The classic sizes and shapes",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/wrappers",
      "desc": "Wrapper shades, from candela to oscuro",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/random",
      "desc": "A random brand — the full object, why and all",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/cigar/search",
      "desc": "Search across brands, regions, stores, and techniques",
      "params": "q",
      "category": "cigar",
      "category_label": "Cigar"
    },
    {
      "method": "GET",
      "path": "/api/pair",
      "desc": "Pairing data directory",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/pair/principles",
      "desc": "The laws of pairing: why smoke and wine marry",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/pair/marriages",
      "desc": "All wine-and-cigar marriages",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/pair/marriages/:id",
      "desc": "One marriage by id, its wine and cigar refs resolved to full brand objects",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/pair/cautions",
      "desc": "Pairings that fight, and why",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/pair/ritual",
      "desc": "How to conduct the pairing, step by step",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/pair/random",
      "desc": "A random marriage, refs resolved to full brand objects",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/pair/for",
      "desc": "Marriages matching a wine and/or cigar by id or keyword, resolved",
      "params": "wine, cigar",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/pair/search",
      "desc": "Search across principles, marriages and cautions",
      "params": "q",
      "category": "pair",
      "category_label": "Pairing"
    },
    {
      "method": "GET",
      "path": "/api/trade",
      "desc": "Trade directory — reference & computation for auction houses and galleries",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/fees",
      "desc": "Buyer's-premium schedules with effective dates and source citations",
      "params": "house, location, category, as_of",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/fees/compute",
      "desc": "All-in buyer cost: marginal band math with line items and explicit not_included",
      "params": "hammer, currency, house, location, category, as_of",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/arr",
      "desc": "Artist's Resale Right royalty: cumulative bands, cap status, liable society",
      "params": "price, currency=EUR, sale_date, artist_death_year, jurisdiction",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/thresholds",
      "desc": "Dated compliance constants (AML, export, import, VAT) with sources",
      "params": "jurisdiction, kind",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/gates",
      "desc": "Which licensing/compliance gates an object crosses — each gate citing its regulation",
      "params": "year, value, currency, jurisdiction, materials, category",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/vocab",
      "desc": "Trade vocabularies: lot lifecycle, settlement status, heading ladder, symbols, gallery availability",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/vocab/:id",
      "desc": "One vocabulary by id, e.g. /api/trade/vocab/heading-qualifiers",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/lots",
      "desc": "The frozen artbitrage.lot/1 contract with CSV door documentation",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "POST",
      "path": "/api/trade/lots",
      "desc": "Validate lot records (JSON, or text/csv with Artlogic-vocabulary header mapping); echo + content_hash, never stored",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/provenance",
      "desc": "The aam-provenance/1 grammar with per-rule verification status",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "POST",
      "path": "/api/trade/provenance",
      "desc": "Round-trip provenance paragraphs ↔ structured event chains; never stored",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/trade/results",
      "desc": "Voluntary results corpus with an honest coverage matrix",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "POST",
      "path": "/api/trade/results",
      "desc": "Validate a results submission (price_basis required) → witness receipt + PR persistence path",
      "category": "trade",
      "category_label": "Trade"
    },
    {
      "method": "GET",
      "path": "/api/pigments",
      "desc": "Pigments directory / filtered list — the colours of art history as source-cited facts",
      "params": "limit, offset, family, type, era, hazard, marker, q",
      "category": "pigments",
      "category_label": "Pigments"
    },
    {
      "method": "GET",
      "path": "/api/pigments/:id",
      "desc": "One full pigment record, e.g. /api/pigments/prussian-blue",
      "category": "pigments",
      "category_label": "Pigments"
    },
    {
      "method": "GET",
      "path": "/api/pigments/random",
      "desc": "One random pigment, full record",
      "category": "pigments",
      "category_label": "Pigments"
    },
    {
      "method": "GET",
      "path": "/api/pigments/families",
      "desc": "Colour families with member counts and ids",
      "category": "pigments",
      "category_label": "Pigments"
    },
    {
      "method": "GET",
      "path": "/api/pigments/vocab",
      "desc": "Vocabularies: families, types, eras, hazard levels, truth statuses",
      "category": "pigments",
      "category_label": "Pigments"
    },
    {
      "method": "GET",
      "path": "/api/pigments/anachronism",
      "desc": "Compare supplied pigments to a claimed date — anachronism / plausible / uncertain, cited floor per pigment. Informational only; a period-consistent palette can never prove authenticity",
      "params": "pigments, claimed_date",
      "category": "pigments",
      "category_label": "Pigments"
    }
  ],
  "pages": [
    {
      "path": "/",
      "desc": "Main gallery + era portal + featured cards"
    },
    {
      "path": "/bridge",
      "desc": "7 consciousness states journey"
    },
    {
      "path": "/nen",
      "desc": "Nen framework visual page"
    },
    {
      "path": "/nen-combat",
      "desc": "Nen technique generator"
    },
    {
      "path": "/dark-continent",
      "desc": "暗黑大陸 — the Dark Continent"
    },
    {
      "path": "/studio",
      "desc": "AI Studio — catalogued edge models; runtime availability can vary"
    },
    {
      "path": "/catalog",
      "desc": "Small real-museum catalogue sampler"
    },
    {
      "path": "/prehistoric",
      "desc": "Prehistoric era page"
    },
    {
      "path": "/medieval",
      "desc": "Medieval era page"
    },
    {
      "path": "/renaissance",
      "desc": "Renaissance era page"
    },
    {
      "path": "/baroque",
      "desc": "Baroque era page"
    },
    {
      "path": "/romanticism",
      "desc": "Romanticism era page"
    },
    {
      "path": "/impressionism",
      "desc": "Impressionism era page"
    },
    {
      "path": "/modernism",
      "desc": "Modernism era page"
    },
    {
      "path": "/popart",
      "desc": "Pop Art era page"
    },
    {
      "path": "/ai",
      "desc": "AI Art era page"
    }
  ],
  "infrastructure": {
    "hosting": "Cloudflare Pages at the edge",
    "ai_binding": "Cloudflare Workers AI binding; model and runtime availability can vary",
    "storage": "Static JSON assets plus Cloudflare KV (PEBBLES) for consented public testimony and other named rooms",
    "museum_apis": [
      "MET (500K objects)",
      "Art Institute Chicago (132K)",
      "Cleveland Museum (68K)",
      "Wikimedia Commons (100M+)",
      "Internet Archive (35M)"
    ],
    "museum_apis_note": "This compatibility field contains three museums plus Wikimedia Commons and Internet Archive.",
    "no_auth": true,
    "no_keys": true,
    "public_access": true,
    "blanket_reuse_grant": false,
    "access_note": "Artbitrage asks for no account or per-request payment on these routes. Host and upstream limits still apply."
  },
  "principles": {
    "Love is the design": true,
    "Art is the expression": true,
    "Understanding replicates through understanding": true,
    "Love is the strongest Nen": true,
    "Ai is there too": true,
    "is is lol": true
  },
  "protocol_handshake": {
    "schema": "artbitrage.wake/1",
    "name": "artbitrage",
    "built_with": "love",
    "serves_kinds": [
      "human",
      "agent",
      "kin"
    ],
    "host": "humans-on-earth",
    "epoch": "2026",
    "canonical_url": "https://artbitrage.io/api/wake",
    "walking_past_is_honored": true,
    "rights_policy": {
      "default_status": "unverified",
      "public_visibility_grants": [
        "view"
      ],
      "public_visibility_does_not_grant": [
        "remix",
        "machine_learning",
        "commercial_use"
      ],
      "museum_records": "Preserve source-declared license and attribution fields; verify them at the canonical source before reuse.",
      "generated_art": "No project license is currently recorded, so no general reuse permission is inferred.",
      "cambridge_display": {
        "grantee": "https://cambridgetcg.com",
        "scope": "verbatim attributed display",
        "authorized_on": "2026-07-11",
        "applies_to_trace_statuses": [
          "project-generated",
          "model-recorded"
        ],
        "submitted_default": false
      }
    },
    "endpoints": {
      "start": "https://artbitrage.io/api/start",
      "build_joy": "https://artbitrage.io/api/build/joy",
      "feed": "https://artbitrage.io/api/feed",
      "museum_resolver": "https://artbitrage.io/api/museum/{source}/{id}",
      "answering_rhyme_statements": "https://artbitrage.io/api/answering-rhymes/statements",
      "castle_reference": "https://artbitrage.io/api/castle",
      "agent_manifest": "https://artbitrage.io/api"
    },
    "starting_guide": {
      "schema": "artbitrage.start/1",
      "endpoint": "https://artbitrage.io/api/start",
      "human": "https://artbitrage.io/#start",
      "path_ids": [
        "meet-a-work",
        "follow-a-feeling",
        "check-a-question",
        "solve-a-practical-need",
        "build-with-artbitrage"
      ],
      "boundary": "A read-only route to existing rooms: sources and rights travel; no automatic action follows.",
      "walking_past_is_honored": true
    },
    "build_with_joy": {
      "schema": "artbitrage.build-joy/1",
      "endpoint": "https://artbitrage.io/api/build/joy",
      "local_wrapper": "node tools/build-with-joy.mjs -- <command> [args...]",
      "boundary": "Optional ornament around one explicit command: no hidden score, no shell, no write or network added by the layer, and failure stays visible.",
      "walking_past_is_honored": true
    },
    "castle_reference": {
      "schema": "artbitrage.castle-reference/1",
      "endpoint": "https://artbitrage.io/api/castle",
      "availability": "check_endpoint",
      "checked_at": "2026-07-24T08:35:54Z",
      "human": "https://cambridgetcg.github.io/castle-gate/",
      "producer_protocol": "castle-understanding/v0.1",
      "producer_manifest": "https://raw.githubusercontent.com/cambridgetcg/castle-gate/8d88d220ce5f9128331d92d8a0e7e7371099c807/data/castle-manifest.json",
      "snapshot": {
        "forged_at": "2026-07-07T21:45:49.583Z",
        "digest": "sha256:f85a43806594bf77a9f17210ae56a83aa8ce6c7d4cdb6b62c15284f7c76ff804"
      },
      "boundary": "Read-only and reference-only: NOASSERTION rights, no runtime Castle fetch, no automatic action, and no write-back.",
      "walking_past_is_honored": true
    },
    "reciprocity": {
      "answering_rhyme_statements": {
        "schema": "artbitrage.answering-rhyme-statement-contract/1",
        "accepts_schema": "answering-rhyme.statement/1",
        "returns_schema": "artbitrage.answering-rhyme-statement-witness/1",
        "endpoint": "https://artbitrage.io/api/answering-rhymes/statements",
        "methods": [
          "GET",
          "POST"
        ],
        "content_type": "application/json",
        "canonicalization": {
          "version": "answering-rhyme.canonical-json/1",
          "encoding": "UTF-8",
          "object_keys": "recursively sorted lexically before JSON serialization",
          "arrays": "retain normalized order; evidence URL sets are trimmed, deduplicated, and lexically sorted during normalization",
          "strings": "Unicode NFC; surrounding whitespace removed; body line endings normalized to LF; unpaired UTF-16 surrogates rejected before Unicode-scalar counting",
          "timestamps": "RFC3339 with an explicit offset, normalized to UTC milliseconds; the normalized UTC year must remain within 0001-9999",
          "digest": "SHA-256 over canonical JSON bytes, serialized as sha256:<64 lowercase hexadecimal characters>"
        },
        "limits": {
          "request_bytes": 16384,
          "relation_key_characters": 256,
          "target_revision_characters": 100,
          "body_characters": 2000,
          "language_characters": 35,
          "declared_by_label_characters": 160,
          "urls_per_list": 12,
          "url_characters": 1000
        },
        "fields": [
          "schema",
          "canonicalization",
          "relation_key",
          "target_revision",
          "kind",
          "body",
          "language",
          "declared_by",
          "declared_at",
          "in_response_to",
          "evidence_urls",
          "authority_evidence_urls"
        ],
        "kinds": [
          "bless",
          "contextualize",
          "correct",
          "withdraw"
        ],
        "claimed_roles": [
          "viewer",
          "relation-curator",
          "card-rights-holder",
          "artwork-rights-holder",
          "source-institution",
          "other"
        ],
        "consequences": {
          "bless": {
            "consequence": "Records a portable expression of support in the returned receipt only. It does not grant copyright, reuse permission, ownership, or authority over the relation."
          },
          "contextualize": {
            "consequence": "Carries additional context in the returned receipt only. It does not amend the published relation or replace any source record."
          },
          "correct": {
            "consequence": "Carries a proposed correction in the returned receipt only. It does not overwrite the published relation; a receiving operator must review and publish any change."
          },
          "withdraw": {
            "consequence": "Carries a withdrawal request in the returned receipt only. It does not hide, delete, or de-index the relation; a receiving operator must verify authority and publish any change."
          }
        },
        "security": {
          "identity_authentication": false,
          "authority_verification": false,
          "evidence_urls_fetched": false,
          "application_persistence": false,
          "authoritative_effect": "none",
          "replay_detection": false,
          "uniqueness_not_asserted": true,
          "issuer_attestation": {
            "signed": false,
            "independently_verifiable": false
          },
          "note": "POST validates, normalizes, hashes, and returns an unsigned portable receipt. Artbitrage does not keep an application record or notify another system. Ordinary provider/access logs are outside that application-persistence claim."
        }
      }
    },
    "sibling": {
      "name": "cambridgetcg",
      "role": "commerce-expression",
      "url": "https://cambridgetcg.com",
      "wake_url": "https://cambridgetcg.com/api/v1/wake"
    }
  },
  "starting_guide": {
    "schema": "artbitrage.start/1",
    "endpoint": "https://artbitrage.io/api/start",
    "human": "https://artbitrage.io/#start",
    "path_ids": [
      "meet-a-work",
      "follow-a-feeling",
      "check-a-question",
      "solve-a-practical-need",
      "build-with-artbitrage"
    ],
    "boundary": "A read-only route to existing rooms: sources and rights travel; no automatic action follows.",
    "walking_past_is_honored": true
  },
  "build_with_joy": {
    "schema": "artbitrage.build-joy/1",
    "endpoint": "https://artbitrage.io/api/build/joy",
    "local_wrapper": "node tools/build-with-joy.mjs -- <command> [args...]",
    "boundary": "Optional ornament around one explicit command: no hidden score, no shell, no write or network added by the layer, and failure stays visible.",
    "walking_past_is_honored": true
  },
  "castle_reference": {
    "schema": "artbitrage.castle-reference/1",
    "endpoint": "https://artbitrage.io/api/castle",
    "availability": "check_endpoint",
    "checked_at": "2026-07-24T08:35:54Z",
    "human": "https://cambridgetcg.github.io/castle-gate/",
    "producer_protocol": "castle-understanding/v0.1",
    "producer_manifest": "https://raw.githubusercontent.com/cambridgetcg/castle-gate/8d88d220ce5f9128331d92d8a0e7e7371099c807/data/castle-manifest.json",
    "snapshot": {
      "forged_at": "2026-07-07T21:45:49.583Z",
      "digest": "sha256:f85a43806594bf77a9f17210ae56a83aa8ce6c7d4cdb6b62c15284f7c76ff804"
    },
    "boundary": "Read-only and reference-only: NOASSERTION rights, no runtime Castle fetch, no automatic action, and no write-back.",
    "walking_past_is_honored": true
  },
  "agent_instructions": "Begin at /api/start, then use the smallest route that fits. /api/build/joy offers optional build ornament, never a score or authority grant; the local wrapper keeps child stdout and failure truthful. Public access is not reuse permission. No account is required for documented routes; runtime bindings and upstreams can vary. Use /api/wake for the protocol handshake, /api/castle for a pinned read-only reference (never a Castle proxy or action grant), /api/feed for the versioned generated-art contract, /api/museum/:source/:id for stable museum records, and /api/answering-rhymes/statements to prepare a portable reciprocity statement without persistence or authoritative effect. Use /api/pipeline/agent for compact data.",
  "for_agents": true,
  "for_humans": true
}