{
  "openapi": "3.1.0",
  "info": {
    "title": "motionprompts API",
    "version": "1.0.0",
    "description": "Read-only static JSON API over the motionprompts catalog (259 production-grade GSAP/WebGL animation components). Catalog and free prompts are key-free static files; paid prompts need a session (see https://motionprompts.dev/pricing/). Start with /llms.txt for usage guidance, or the developer portal at https://motionprompts.dev/developers/.\n\n**Versioning & deprecation policy**: the API is path-versioned. /api/v1/ is the canonical prefix; the unversioned /api/ paths are aliases that always serve the latest major version. A breaking change ships as /api/v2/ while /v1/ keeps working for at least 6 months, announced in /llms.txt and with a Deprecation header on the old endpoints.\n\n**Access**: 30 of 259 components publish their prompt at /prompts/<slug>.md. The other 229 return it from /api/premium/prompt/<slug> with a session cookie; without one that endpoint answers 402 with the first 12 lines of the prompt in the body.\n\n**Errors**: RFC 9457 application/problem+json on 402, 404 and 429.\n\n**Rate limits**: 30 requests/second per IP with burst 60, advertised via RateLimit-Policy response headers; 429 responses carry Retry-After.",
    "contact": {
      "name": "Vanguardia",
      "email": "contact@vanguardia.dev",
      "url": "https://vanguardia.dev"
    }
  },
  "servers": [
    {
      "url": "https://motionprompts.dev"
    }
  ],
  "paths": {
    "/api/v1/components.json": {
      "get": {
        "operationId": "listComponents",
        "summary": "All 259 components with motion metadata and composition contract",
        "description": "Each entry carries slug, title, category, description, URLs (demo, prompt, page, thumb, preview), the measured `motion` block (trigger, cluster, easing, durations, pinning, viewport heights…), exclusive capabilities and conflicts. `null` means 'not determinable from the code', never zero.",
        "responses": {
          "200": {
            "description": "The full catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "version",
                    "site",
                    "count",
                    "components"
                  ],
                  "properties": {
                    "version": {
                      "type": "integer"
                    },
                    "site": {
                      "type": "string",
                      "format": "uri"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "generated_from": {
                      "type": "string"
                    },
                    "note": {
                      "type": "string"
                    },
                    "components": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "slug",
                          "title",
                          "category",
                          "description",
                          "demo",
                          "prompt",
                          "page",
                          "motion",
                          "kind",
                          "access"
                        ],
                        "properties": {
                          "slug": {
                            "type": "string"
                          },
                          "title": {
                            "type": "string"
                          },
                          "category": {
                            "type": "string"
                          },
                          "description": {
                            "type": "string"
                          },
                          "kind": {
                            "type": "string",
                            "enum": [
                              "component",
                              "shader",
                              "gradient",
                              "background",
                              "template"
                            ]
                          },
                          "access": {
                            "type": "string",
                            "enum": [
                              "free",
                              "paid"
                            ],
                            "description": "`paid` items need a plan; see /pricing/."
                          },
                          "demo": {
                            "type": "string",
                            "format": "uri"
                          },
                          "prompt": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "uri",
                            "description": "Public markdown prompt. null when access is paid."
                          },
                          "prompt_api": {
                            "type": "string",
                            "format": "uri",
                            "description": "Session-gated prompt endpoint. 402 without a plan, with a 12-line preview in the body."
                          },
                          "preview_prompt": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "uri",
                            "description": "First 12 non-empty lines of a paid prompt. null when access is free (the full prompt is public)."
                          },
                          "page": {
                            "type": "string",
                            "format": "uri"
                          },
                          "thumb": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "uri"
                          },
                          "preview": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "format": "uri"
                          },
                          "motion": {
                            "type": "object",
                            "description": "Motion metadata measured from the component's real code. null = not determinable.",
                            "properties": {
                              "trigger": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "libs": {
                                "type": "array",
                                "items": {
                                  "type": "string"
                                }
                              },
                              "complexity": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "pinned": {
                                "type": [
                                  "boolean",
                                  "null"
                                ]
                              },
                              "viewport_heights": {
                                "type": [
                                  "number",
                                  "null"
                                ]
                              },
                              "needs_lenis": {
                                "type": [
                                  "boolean",
                                  "null"
                                ]
                              },
                              "ease_family": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "duration_range": {
                                "type": [
                                  "array",
                                  "null"
                                ],
                                "items": {
                                  "type": "number"
                                }
                              },
                              "stagger": {
                                "type": [
                                  "boolean",
                                  "null"
                                ]
                              },
                              "assets_required": {
                                "type": [
                                  "boolean",
                                  "null"
                                ]
                              },
                              "mobile_behavior": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "solo_on_page": {
                                "type": [
                                  "boolean",
                                  "null"
                                ]
                              },
                              "solo_reasons": {
                                "type": [
                                  "array",
                                  "null"
                                ],
                                "items": {
                                  "type": "string"
                                }
                              },
                              "cluster": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "engine": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "motion_signature": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              },
                              "systems": {
                                "type": [
                                  "array",
                                  "null"
                                ],
                                "items": {
                                  "type": "string"
                                }
                              },
                              "native_system": {
                                "type": [
                                  "string",
                                  "null"
                                ]
                              }
                            }
                          },
                          "capabilities": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          },
                          "conflicts_with": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "properties": {
                                "slug": {
                                  "type": "string"
                                },
                                "kind": {
                                  "type": "string"
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-IP rate limit exceeded (30 req/s, burst 60). Retry-After header included.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/motion-systems.json": {
      "get": {
        "operationId": "listMotionSystems",
        "summary": "The 8 motion systems and their ease/duration/stagger tokens",
        "description": "Token sets derived from the real inventory. Pick ONE system for a whole page; tokens are real values present in member components, never averages.",
        "responses": {
          "200": {
            "description": "The 8 motion systems.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "version",
                    "site",
                    "count",
                    "systems"
                  ],
                  "properties": {
                    "version": {
                      "type": "integer"
                    },
                    "site": {
                      "type": "string",
                      "format": "uri"
                    },
                    "count": {
                      "type": "integer"
                    },
                    "note": {
                      "type": "string"
                    },
                    "systems": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "description": "One motion system: name plus ease/duration/stagger tokens present in its members.",
                        "additionalProperties": true
                      }
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-IP rate limit exceeded (30 req/s, burst 60). Retry-After header included.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/composition-rules.json": {
      "get": {
        "operationId": "getCompositionRules",
        "summary": "Hard and soft rules for composing components into one page",
        "description": "Machine-readable composition contract: single scroll owner, single entry veil, WebGL and pinning budgets, per-rule holder counts. Read this BEFORE choosing components.",
        "responses": {
          "200": {
            "description": "The composition rule set.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "version",
                    "site",
                    "hard_rules",
                    "soft_rules"
                  ],
                  "properties": {
                    "version": {
                      "type": "integer"
                    },
                    "site": {
                      "type": "string",
                      "format": "uri"
                    },
                    "prose": {
                      "type": "string",
                      "format": "uri"
                    },
                    "budget": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer"
                      }
                    },
                    "exclusive_capabilities": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer"
                      }
                    },
                    "non_repeatable_categories": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "library_weight_gzip": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer"
                      }
                    },
                    "hard_rules": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "rule"
                        ],
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "rule": {
                            "type": "string"
                          }
                        },
                        "additionalProperties": true
                      }
                    },
                    "soft_rules": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "required": [
                          "id",
                          "rule"
                        ],
                        "properties": {
                          "id": {
                            "type": "string"
                          },
                          "rule": {
                            "type": "string"
                          }
                        }
                      }
                    }
                  },
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-IP rate limit exceeded (30 req/s, burst 60). Retry-After header included.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/prompts/{slug}.md": {
      "get": {
        "operationId": "getComponentPrompt",
        "summary": "The build prompt for one FREE component, plain markdown",
        "description": "Published for the 30 components whose `access` is `free`. For the other 229 this path returns 404 on purpose, use /api/premium/prompt/{slug}.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "description": "Component slug, as listed in /api/v1/components.json."
          }
        ],
        "responses": {
          "200": {
            "description": "The prompt.",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-IP rate limit exceeded (30 req/s, burst 60). Retry-After header included.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/prompts/{slug}.preview.md": {
      "get": {
        "operationId": "getComponentPromptPreview",
        "summary": "First 12 non-empty lines of a PAID prompt",
        "description": "The same text the site shows behind the lock, and the same one the 402 body carries.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "description": "Component slug, as listed in /api/v1/components.json."
          }
        ],
        "responses": {
          "200": {
            "description": "The preview.",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-IP rate limit exceeded (30 req/s, burst 60). Retry-After header included.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/premium/prompt/{slug}": {
      "get": {
        "operationId": "getPaidComponentPrompt",
        "summary": "The build prompt for one paid component (session required)",
        "description": "Needs the session cookie set by signing in with a plan of Unlimited or above. Without it the response is 402 with the preview inside, so an agent can decide whether to point a human at https://motionprompts.dev/pricing/.",
        "security": [
          {
            "cookieAuth": []
          }
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "description": "Component slug, as listed in /api/v1/components.json."
          }
        ],
        "responses": {
          "200": {
            "description": "The prompt.",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "description": "No session.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "examples": [
                        "plan_required"
                      ]
                    },
                    "requires": {
                      "type": "string",
                      "examples": [
                        "unlimited"
                      ]
                    },
                    "preview": {
                      "type": "string",
                      "description": "First 12 non-empty lines of the prompt."
                    },
                    "pricing": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          },
          "402": {
            "description": "Signed in, but the plan does not include prompts.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "error"
                  ],
                  "properties": {
                    "error": {
                      "type": "string",
                      "examples": [
                        "plan_required"
                      ]
                    },
                    "requires": {
                      "type": "string",
                      "examples": [
                        "unlimited"
                      ]
                    },
                    "preview": {
                      "type": "string",
                      "description": "First 12 non-empty lines of the prompt."
                    },
                    "pricing": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Unknown slug."
          },
          "429": {
            "description": "Rate limited."
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "summary": "Agent-facing guide: what this site is and how to consume it",
        "responses": {
          "200": {
            "description": "The guide.",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Resource not found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Per-IP rate limit exceeded (30 req/s, burst 60). Retry-After header included.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "RFC 9457 problem details.",
                  "required": [
                    "title",
                    "status"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "URI identifying the problem type."
                    },
                    "title": {
                      "type": "string"
                    },
                    "status": {
                      "type": "integer"
                    },
                    "detail": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "cookieAuth": {
        "type": "apiKey",
        "in": "cookie",
        "name": "mp_sid"
      }
    },
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details.",
        "required": [
          "title",
          "status"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "URI identifying the problem type."
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          }
        }
      },
      "PlanRequired": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "examples": [
              "plan_required"
            ]
          },
          "requires": {
            "type": "string",
            "examples": [
              "unlimited"
            ]
          },
          "preview": {
            "type": "string",
            "description": "First 12 non-empty lines of the prompt."
          },
          "pricing": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "MotionBlock": {
        "type": "object",
        "description": "Motion metadata measured from the component's real code. null = not determinable.",
        "properties": {
          "trigger": {
            "type": [
              "string",
              "null"
            ]
          },
          "libs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "complexity": {
            "type": [
              "string",
              "null"
            ]
          },
          "pinned": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "viewport_heights": {
            "type": [
              "number",
              "null"
            ]
          },
          "needs_lenis": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "ease_family": {
            "type": [
              "string",
              "null"
            ]
          },
          "duration_range": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "number"
            }
          },
          "stagger": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "assets_required": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "mobile_behavior": {
            "type": [
              "string",
              "null"
            ]
          },
          "solo_on_page": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "solo_reasons": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "cluster": {
            "type": [
              "string",
              "null"
            ]
          },
          "engine": {
            "type": [
              "string",
              "null"
            ]
          },
          "motion_signature": {
            "type": [
              "string",
              "null"
            ]
          },
          "systems": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "native_system": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Component": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "category",
          "description",
          "demo",
          "prompt",
          "page",
          "motion",
          "kind",
          "access"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "component",
              "shader",
              "gradient",
              "background",
              "template"
            ]
          },
          "access": {
            "type": "string",
            "enum": [
              "free",
              "paid"
            ],
            "description": "`paid` items need a plan; see /pricing/."
          },
          "demo": {
            "type": "string",
            "format": "uri"
          },
          "prompt": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "Public markdown prompt. null when access is paid."
          },
          "prompt_api": {
            "type": "string",
            "format": "uri",
            "description": "Session-gated prompt endpoint. 402 without a plan, with a 12-line preview in the body."
          },
          "preview_prompt": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "First 12 non-empty lines of a paid prompt. null when access is free (the full prompt is public)."
          },
          "page": {
            "type": "string",
            "format": "uri"
          },
          "thumb": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "preview": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri"
          },
          "motion": {
            "type": "object",
            "description": "Motion metadata measured from the component's real code. null = not determinable.",
            "properties": {
              "trigger": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "libs": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "complexity": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "pinned": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "viewport_heights": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "needs_lenis": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "ease_family": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "duration_range": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "number"
                }
              },
              "stagger": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "assets_required": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "mobile_behavior": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "solo_on_page": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "solo_reasons": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "cluster": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "engine": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "motion_signature": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "systems": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "string"
                }
              },
              "native_system": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "capabilities": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "conflicts_with": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "kind": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "ComponentsResponse": {
        "type": "object",
        "required": [
          "version",
          "site",
          "count",
          "components"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "site": {
            "type": "string",
            "format": "uri"
          },
          "count": {
            "type": "integer"
          },
          "generated_from": {
            "type": "string"
          },
          "note": {
            "type": "string"
          },
          "components": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "slug",
                "title",
                "category",
                "description",
                "demo",
                "prompt",
                "page",
                "motion",
                "kind",
                "access"
              ],
              "properties": {
                "slug": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "component",
                    "shader",
                    "gradient",
                    "background",
                    "template"
                  ]
                },
                "access": {
                  "type": "string",
                  "enum": [
                    "free",
                    "paid"
                  ],
                  "description": "`paid` items need a plan; see /pricing/."
                },
                "demo": {
                  "type": "string",
                  "format": "uri"
                },
                "prompt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "uri",
                  "description": "Public markdown prompt. null when access is paid."
                },
                "prompt_api": {
                  "type": "string",
                  "format": "uri",
                  "description": "Session-gated prompt endpoint. 402 without a plan, with a 12-line preview in the body."
                },
                "preview_prompt": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "uri",
                  "description": "First 12 non-empty lines of a paid prompt. null when access is free (the full prompt is public)."
                },
                "page": {
                  "type": "string",
                  "format": "uri"
                },
                "thumb": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "uri"
                },
                "preview": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "uri"
                },
                "motion": {
                  "type": "object",
                  "description": "Motion metadata measured from the component's real code. null = not determinable.",
                  "properties": {
                    "trigger": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "libs": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "complexity": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "pinned": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "viewport_heights": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "needs_lenis": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "ease_family": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "duration_range": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "number"
                      }
                    },
                    "stagger": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "assets_required": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "mobile_behavior": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "solo_on_page": {
                      "type": [
                        "boolean",
                        "null"
                      ]
                    },
                    "solo_reasons": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "string"
                      }
                    },
                    "cluster": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "engine": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "motion_signature": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "systems": {
                      "type": [
                        "array",
                        "null"
                      ],
                      "items": {
                        "type": "string"
                      }
                    },
                    "native_system": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                },
                "capabilities": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "conflicts_with": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "slug": {
                        "type": "string"
                      },
                      "kind": {
                        "type": "string"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "MotionSystemsResponse": {
        "type": "object",
        "required": [
          "version",
          "site",
          "count",
          "systems"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "site": {
            "type": "string",
            "format": "uri"
          },
          "count": {
            "type": "integer"
          },
          "note": {
            "type": "string"
          },
          "systems": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "One motion system: name plus ease/duration/stagger tokens present in its members.",
              "additionalProperties": true
            }
          }
        }
      },
      "CompositionRules": {
        "type": "object",
        "required": [
          "version",
          "site",
          "hard_rules",
          "soft_rules"
        ],
        "properties": {
          "version": {
            "type": "integer"
          },
          "site": {
            "type": "string",
            "format": "uri"
          },
          "prose": {
            "type": "string",
            "format": "uri"
          },
          "budget": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "exclusive_capabilities": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "non_repeatable_categories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "library_weight_gzip": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            }
          },
          "hard_rules": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "rule"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "rule": {
                  "type": "string"
                }
              },
              "additionalProperties": true
            }
          },
          "soft_rules": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "rule"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "rule": {
                  "type": "string"
                }
              }
            }
          }
        },
        "additionalProperties": true
      }
    }
  }
}