dotsy · Schema

Route

CompanyArtificial IntelligenceWebsite BuilderNo-CodeFree

Properties

Name Type Description
path string The URL path. The home page is `/`. A `:param` segment makes a pattern route.
contentKey stringnull The content key this route serves. Null on a redirect, and on a route with no explicit key (it then serves the key derived from its path).
layout stringnull Layout file key, for example `layouts/main.html`.
title stringnull Page title.
vars objectnull Template variables passed to the layout.
purpose stringnull `redirect` for a redirect route, otherwise null.
redirectTo stringnull Redirect target, a root-relative path. Set only when `purpose` is `redirect`.
redirectStatus object Redirect status code. Null means the default (301).
preserveQuery booleannull Whether a redirect appends the visitor's query string to its target. Null means the default (true).
navLabel stringnull Deprecated. Menu link text — use the menu API instead.
nav arraynull Deprecated. Menu memberships — use the menu API instead.
experiment objectnull The page's A/B test, when it has one.
noindex booleannull True when the page is excluded from the sitemap and marked `noindex`.
createdBy stringnull Who made this route a redirect: a signed-in `person`, an `ai` (MCP OAuth), an API `key`, or a page `move`. Present only on redirects.
createdById stringnull The user id when `createdBy` is `person`.
updatedAt number Last change, Unix ms.
View JSON Schema on GitHub

JSON Schema

dotsy-ai-route-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/dotsy-ai/json-schema/dotsy-ai-route-schema.json",
  "title": "Route",
  "x-generated": "2026-11-06",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/dotsy-ai-openapi.yml#/components/schemas/Route",
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "The URL path. The home page is `/`. A `:param` segment makes a pattern route."
    },
    "contentKey": {
      "type": [
        "string",
        "null"
      ],
      "description": "The content key this route serves. Null on a redirect, and on a route with no explicit key (it then serves the key derived from its path)."
    },
    "layout": {
      "type": [
        "string",
        "null"
      ],
      "description": "Layout file key, for example `layouts/main.html`."
    },
    "title": {
      "type": [
        "string",
        "null"
      ],
      "description": "Page title."
    },
    "vars": {
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": {
        "type": "string"
      },
      "description": "Template variables passed to the layout."
    },
    "purpose": {
      "type": [
        "string",
        "null"
      ],
      "description": "`redirect` for a redirect route, otherwise null."
    },
    "redirectTo": {
      "type": [
        "string",
        "null"
      ],
      "description": "Redirect target, a root-relative path. Set only when `purpose` is `redirect`."
    },
    "redirectStatus": {
      "anyOf": [
        {
          "type": "number",
          "enum": [
            301
          ]
        },
        {
          "type": "number",
          "enum": [
            302
          ]
        },
        {
          "type": "number",
          "enum": [
            308
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "Redirect status code. Null means the default (301)."
    },
    "preserveQuery": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Whether a redirect appends the visitor's query string to its target. Null means the default (true)."
    },
    "navLabel": {
      "type": [
        "string",
        "null"
      ],
      "description": "Deprecated. Menu link text — use the menu API instead."
    },
    "nav": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": "object",
        "properties": {
          "menu": {
            "type": "string",
            "minLength": 1,
            "description": "Menu this page joins — matches a <dotsy-nav menu=\"…\"> in the layout/fragment (e.g. \"primary\", \"footer\")."
          },
          "order": {
            "type": "integer",
            "description": "Sort position among siblings in this menu, ascending. Use gaps (10, 20, 30) to leave room for inserts."
          },
          "parent": {
            "type": [
              "string",
              "null"
            ],
            "description": "Parent route path within this menu for a nested/dropdown item (e.g. \"/services\"). Omit for top level."
          }
        },
        "required": [
          "menu"
        ]
      },
      "description": "Deprecated. Menu memberships — use the menu API instead."
    },
    "experiment": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^[a-z0-9-]+$",
          "description": "Stable experiment slug — cookie namespace; unique per site forever."
        },
        "name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        "hypothesis": {
          "type": "string",
          "maxLength": 200
        },
        "status": {
          "type": "string",
          "enum": [
            "draft",
            "running",
            "ended"
          ]
        },
        "variants": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z0-9-]+$",
                "description": "Variant arm id — default \"a\" / \"b\" on create."
              },
              "label": {
                "type": "string",
                "maxLength": 80
              },
              "weight": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "contentKey": {
                "type": "string",
                "minLength": 1,
                "description": "Published body key (may be routeless)."
              }
            },
            "required": [
              "id",
              "weight",
              "contentKey"
            ]
          },
          "minItems": 2,
          "maxItems": 3
        },
        "goalId": {
          "type": "string",
          "minLength": 1,
          "description": "Optional dotsy conversion goal; omit when tracking in external analytics."
        },
        "changeNote": {
          "type": "string",
          "maxLength": 120,
          "description": "One line on what the variant changes (0.56e M2). Kept here so route PATCH round-trips (weights/settings updates) don't strip it."
        },
        "handsOff": {
          "type": "boolean",
          "description": "Hands-off mode (0.56e M4): the daily sweep may auto-promote a ≥95% winner or auto-end keep-A after 30 days. Prefer setting this via start_test; kept here so route PATCH round-trips (weights/settings updates) don't strip the flag."
        },
        "startedAt": {
          "type": "string"
        },
        "endedAt": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "name",
        "status",
        "variants"
      ],
      "description": "The page's A/B test, when it has one."
    },
    "noindex": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "True when the page is excluded from the sitemap and marked `noindex`."
    },
    "createdBy": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "person",
        "ai",
        "key",
        "move"
      ],
      "description": "Who made this route a redirect: a signed-in `person`, an `ai` (MCP OAuth), an API `key`, or a page `move`. Present only on redirects."
    },
    "createdById": {
      "type": [
        "string",
        "null"
      ],
      "description": "The user id when `createdBy` is `person`."
    },
    "updatedAt": {
      "type": "number",
      "description": "Last change, Unix ms."
    }
  },
  "required": [
    "path",
    "contentKey",
    "layout",
    "title",
    "vars",
    "purpose",
    "redirectTo",
    "redirectStatus",
    "preserveQuery",
    "navLabel",
    "nav",
    "updatedAt"
  ]
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/dotsy-ai-route"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.