{
  "openapi": "3.1.0",
  "info": {
    "title": "Syncek Content API",
    "version": "1.1.0",
    "termsOfService": "https://syncek.com/legal/api-terms",
    "summary": "Read-only, machine-readable access to everything syncek.com publishes.",
    "description": "Syncek is a CRM for small businesses that combines spreadsheet-like inline editing with structured fields, Kanban pipelines, two-way Gmail sync, and team collaboration. It ships as a single product, Syncek One.\n\nThis document describes the public read-only endpoints of the syncek.com website: the AI-oriented site summaries (`llms.txt`, `llms-full.txt`), markdown twins of the documentation, the verified SMB CRM pricing dataset, the documentation search index, and the feeds and sitemaps. Everything here is anonymous, unauthenticated, cacheable and safe to call.\n\nIt does NOT describe the Syncek product's own REST API. That is a feature of the CRM application, it is not publicly reachable while Syncek is in early access, and it will be documented at its own origin when it opens. Nothing in this document reads or writes customer data.\n\n## Versioning\n\nThere is no version segment in these paths, and there will not be one. `/robots.txt` and `/llms.txt` are the URLs their own standards specify, `/blog/rss.xml` is the URL that is in people's feed readers, and moving any of them behind a `/v1/` prefix would break every existing consumer to satisfy a convention that does not apply to published documents. The document is versioned instead, by `info.version`, as semver:\n\n- PATCH: editorial changes here. Nothing about a response changes.\n- MINOR: an operation, path, field or enum value is ADDED. Existing calls keep working.\n- MAJOR: a response shape, path or operationId changes or is removed.\n\nPin `info.version` if you need to notice. Every field documented here is additive-safe: treat unknown fields as ignorable rather than erroring on them.\n\n## Deprecation\n\nAn operation being retired is marked `deprecated: true` here first, and its responses carry `Deprecation` (RFC 9745) and `Sunset` (RFC 8594) headers naming the date it stops answering. The gap between the two is at least 90 days. No operation is deprecated today, so no endpoint currently sends either header. If you receive a `Sunset` on any URL in this document, it is the retirement of that URL and not an outage.",
    "contact": {
      "name": "Syncek",
      "email": "hello@syncek.com",
      "url": "https://syncek.com/contact"
    }
  },
  "servers": [
    {
      "url": "https://syncek.com",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "ai-surfaces",
      "description": "Summaries of the whole site written for a model to read instead of crawling the HTML."
    },
    {
      "name": "documentation",
      "description": "The product guides and changelog, as the same markdown the pages render."
    },
    {
      "name": "datasets",
      "description": "Structured data published for reuse, each with its source and read date."
    },
    {
      "name": "feeds",
      "description": "What changed, as RSS."
    },
    {
      "name": "discovery",
      "description": "Crawl and indexing metadata."
    }
  ],
  "paths": {
    "/llms.txt": {
      "get": {
        "operationId": "getSiteSummary",
        "tags": [
          "ai-surfaces"
        ],
        "summary": "English site summary for AI agents",
        "description": "The llmstxt.org summary of the whole site in English: what Syncek is, its early-access status, every main page, key facts, the full FAQ, guides, comparisons, resources, legal pages, contacts and the blog index, each with a one-line description. Read this first to answer a question about Syncek without crawling. Regenerated per request, so scheduled content appears on its date.",
        "responses": {
          "200": {
            "description": "The site summary as llmstxt.org markdown.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/llms.txt": {
      "get": {
        "operationId": "getSiteSummaryByLocale",
        "tags": [
          "ai-surfaces"
        ],
        "summary": "Site summary for AI agents in one language",
        "description": "The same summary as `getSiteSummary`, in Spanish, German or Portuguese. Each is a distinct document with that language's own URLs, not a translation of the English one: slugs are localized per locale, so the links differ.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The site summary in the requested language.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "operationId": "getSiteReference",
        "tags": [
          "ai-surfaces"
        ],
        "x-llms-listed": true,
        "summary": "Extended English reference",
        "description": "The long-form companion to `/llms.txt`: full product overview, the origin story, per-plan pricing with every included feature, the competitor comparison table, complete FAQ answers and the 25 most recent changelog entries. Use when the summary is not specific enough.",
        "responses": {
          "200": {
            "description": "The extended reference as markdown.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/llms-full.txt": {
      "get": {
        "operationId": "getSiteReferenceByLocale",
        "tags": [
          "ai-surfaces"
        ],
        "summary": "Extended reference in one language",
        "description": "The extended reference in Spanish, German or Portuguese, with that locale's prices, plan names and URLs.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The extended reference in the requested language.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/md": {
      "get": {
        "operationId": "getSiteSummaryAsMarkdown",
        "tags": [
          "ai-surfaces"
        ],
        "summary": "Site summary under a markdown content-type",
        "x-llms-listed": true,
        "description": "BYTE-IDENTICAL TO `/llms.txt`, served as `text/markdown` instead of `text/plain`. It is not a markdown rendering of the home page and does not contain the home page's copy; it is the same site summary `getSiteSummary` returns. It exists so that `Accept: text/markdown` on `/` can be answered with a correct content-type, and sending that header to `/` is the preferred way to reach it. Roughly one twenty-fifth the bytes of the rendered home page.",
        "responses": {
          "200": {
            "description": "The site summary, as text/markdown.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/md": {
      "get": {
        "operationId": "getSiteSummaryAsMarkdownByLocale",
        "tags": [
          "ai-surfaces"
        ],
        "summary": "Localized site summary under a markdown content-type",
        "description": "The same body as `getSiteSummaryByLocale`, served as `text/markdown`. Also reachable by sending `Accept: text/markdown` to `/es`, `/de` or `/pt`.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The localized site summary, as text/markdown.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/{section}/{slug}.md": {
      "get": {
        "operationId": "getGuideMarkdown",
        "tags": [
          "documentation"
        ],
        "summary": "One documentation guide as markdown",
        "description": "The raw markdown of a single guide, from the same source the HTML page renders, so the two cannot disagree. Served `noindex` because it is a second URL for one document; fetching it is expected, indexing it is not.",
        "parameters": [
          {
            "name": "section",
            "in": "path",
            "required": true,
            "description": "Documentation section the guide belongs to.",
            "schema": {
              "type": "string",
              "enum": [
                "get-started",
                "core-concepts",
                "your-data",
                "views",
                "email"
              ]
            }
          },
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The guide's slug within its section. Enumerate the valid values from `getDocsSearchIndex` or from the section index.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The guide as markdown, with its frontmatter title.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/docs/{section}.md": {
      "get": {
        "operationId": "getGuideSectionMarkdown",
        "tags": [
          "documentation"
        ],
        "summary": "One documentation section index as markdown",
        "description": "The section's lead followed by every guide under it with its description and its own `.md` URL. Read this to find out what a section covers and which guide to fetch next.",
        "parameters": [
          {
            "name": "section",
            "in": "path",
            "required": true,
            "description": "Documentation section to list.",
            "schema": {
              "type": "string",
              "enum": [
                "get-started",
                "core-concepts",
                "your-data",
                "views",
                "email"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The section index as markdown.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/blog/{slug}.md": {
      "get": {
        "operationId": "getBlogPostMarkdown",
        "tags": [
          "documentation"
        ],
        "summary": "One blog post as markdown",
        "description": "The raw markdown of a single post in the `/blog` section, from the same source the HTML page renders, so the two cannot disagree. A head-to-head comparison is served from `/compare` instead and has its own path below; asking for one here returns a 404 that names its real URL. The frontmatter carries the canonical URL of the page it duplicates and the publish dates. Served `noindex` because it is a second URL for one document; fetching it is expected, indexing it is not. Enumerate the published slugs from `/llms.txt`.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The post's slug IN THE REQUESTED LOCALE. Slugs are localized, so a Spanish post is not reachable at its English slug; ask `/es/llms.txt` for the Spanish ones.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The post as markdown, with its frontmatter.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/blog/{slug}.md": {
      "get": {
        "operationId": "getBlogPostMarkdownLocalized",
        "tags": [
          "documentation"
        ],
        "summary": "One blog post as markdown, in a prefixed locale",
        "description": "The `es`/`de`/`pt` form of `getBlogPostMarkdown`. `/blog` is the one section word this site does not localize, so only the locale prefix changes; the comparison section IS localized and carries one path per language. A `de`/`pt` request for a post with no translation returns the English text and says so in `Content-Language`.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          },
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The post's slug in that locale.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The post as markdown, with its frontmatter.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/compare/{slug}.md": {
      "get": {
        "operationId": "getComparisonPostMarkdown",
        "tags": [
          "documentation"
        ],
        "summary": "One comparison post as markdown",
        "description": "The raw markdown of a single head-to-head comparison post, from the same source the HTML page renders. Comparison posts are the same corpus as the blog and are served from their own section, whose word is localized, so this path exists once per language and a post is not reachable under another locale's section word. The frontmatter carries the canonical URL and the publish dates. Served `noindex` because it is a second URL for one document. Enumerate the published URLs from `/llms.txt`, or `/{locale}/llms.txt`.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The post's slug IN THIS LOCALE. Slugs are localized, so a Spanish comparison is not reachable at its English slug.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The comparison post as markdown, with its frontmatter.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/es/comparativas/{slug}.md": {
      "get": {
        "operationId": "getComparisonPostMarkdownEs",
        "tags": [
          "documentation"
        ],
        "summary": "One comparison post as markdown, in es",
        "description": "The raw markdown of a single head-to-head comparison post, from the same source the HTML page renders. Comparison posts are the same corpus as the blog and are served from their own section, whose word is localized, so this path exists once per language and a post is not reachable under another locale's section word. The frontmatter carries the canonical URL and the publish dates. Served `noindex` because it is a second URL for one document. Enumerate the published URLs from `/llms.txt`, or `/{locale}/llms.txt`.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The post's slug IN THIS LOCALE. Slugs are localized, so a Spanish comparison is not reachable at its English slug.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The comparison post as markdown, with its frontmatter.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/de/vergleiche/{slug}.md": {
      "get": {
        "operationId": "getComparisonPostMarkdownDe",
        "tags": [
          "documentation"
        ],
        "summary": "One comparison post as markdown, in de",
        "description": "The raw markdown of a single head-to-head comparison post, from the same source the HTML page renders. Comparison posts are the same corpus as the blog and are served from their own section, whose word is localized, so this path exists once per language and a post is not reachable under another locale's section word. The frontmatter carries the canonical URL and the publish dates. Served `noindex` because it is a second URL for one document. Enumerate the published URLs from `/llms.txt`, or `/{locale}/llms.txt`.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The post's slug IN THIS LOCALE. Slugs are localized, so a Spanish comparison is not reachable at its English slug.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The comparison post as markdown, with its frontmatter.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/pt/comparativos/{slug}.md": {
      "get": {
        "operationId": "getComparisonPostMarkdownPt",
        "tags": [
          "documentation"
        ],
        "summary": "One comparison post as markdown, in pt",
        "description": "The raw markdown of a single head-to-head comparison post, from the same source the HTML page renders. Comparison posts are the same corpus as the blog and are served from their own section, whose word is localized, so this path exists once per language and a post is not reachable under another locale's section word. The frontmatter carries the canonical URL and the publish dates. Served `noindex` because it is a second URL for one document. Enumerate the published URLs from `/llms.txt`, or `/{locale}/llms.txt`.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The post's slug IN THIS LOCALE. Slugs are localized, so a Spanish comparison is not reachable at its English slug.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The comparison post as markdown, with its frontmatter.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/docs/changelog.md": {
      "get": {
        "operationId": "getChangelogMarkdown",
        "tags": [
          "documentation"
        ],
        "x-llms-listed": true,
        "summary": "Full changelog as markdown",
        "description": "Every dated changelog entry, newest first. The complete log, where `/llms-full.txt` carries only the 25 most recent. Use it to answer whether and how actively Syncek is maintained.",
        "responses": {
          "200": {
            "description": "The changelog as markdown.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/docs/{section}/{slug}.md": {
      "get": {
        "operationId": "getGuideMarkdownByLocale",
        "tags": [
          "documentation"
        ],
        "summary": "One documentation guide as markdown, in one language",
        "description": "The markdown of a single guide in Spanish, German or Portuguese. A guide not yet translated falls back to the English text rather than 404ing, so a 200 here does not by itself prove the content is in the requested language.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          },
          {
            "name": "section",
            "in": "path",
            "required": true,
            "description": "Documentation section the guide belongs to.",
            "schema": {
              "type": "string",
              "enum": [
                "get-started",
                "core-concepts",
                "your-data",
                "views",
                "email"
              ]
            }
          },
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The guide's slug within its section.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The guide as markdown, in the requested language.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/docs/{section}.md": {
      "get": {
        "operationId": "getGuideSectionMarkdownByLocale",
        "tags": [
          "documentation"
        ],
        "summary": "One documentation section index as markdown, in one language",
        "description": "The section's lead and every guide under it, in Spanish, German or Portuguese, each with its own localized `.md` URL.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          },
          {
            "name": "section",
            "in": "path",
            "required": true,
            "description": "Documentation section to list.",
            "schema": {
              "type": "string",
              "enum": [
                "get-started",
                "core-concepts",
                "your-data",
                "views",
                "email"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The section index as markdown, in the requested language.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/docs/changelog.md": {
      "get": {
        "operationId": "getChangelogMarkdownByLocale",
        "tags": [
          "documentation"
        ],
        "summary": "Full changelog as markdown, in one language",
        "description": "Every dated changelog entry in Spanish, German or Portuguese, newest first. The complete log, where the locale's `llms-full.txt` carries only the most recent window of it.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The changelog as markdown, in the requested language.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "description": "No document is served at that path. The body is an RFC 9457 problem document naming the valid shapes and where to enumerate them.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "type": "object",
                  "description": "An RFC 9457 problem document.",
                  "required": [
                    "type",
                    "title",
                    "status",
                    "detail"
                  ],
                  "properties": {
                    "type": {
                      "type": "string",
                      "format": "uri",
                      "description": "A URL that describes this class of problem and where to resolve it. Never `about:blank`."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short, stable summary of the problem type."
                    },
                    "status": {
                      "type": "integer",
                      "description": "The HTTP status code, repeated in the body."
                    },
                    "detail": {
                      "type": "string",
                      "description": "What went wrong with THIS request, and how to find the valid values."
                    },
                    "instance": {
                      "type": "string",
                      "format": "uri",
                      "description": "The URL that produced the problem."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/docs/search-index.json": {
      "get": {
        "operationId": "getDocsSearchIndex",
        "tags": [
          "documentation"
        ],
        "x-llms-listed": true,
        "summary": "Search index over the documentation",
        "description": "Every documentation page, section index and changelog entry as one flat array, with lowercased tag-stripped body text for substring matching. This is the cheapest way to enumerate the docs corpus and resolve a topic to a URL before fetching the markdown for it.",
        "responses": {
          "200": {
            "description": "The complete documentation search index.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "description": "Every searchable documentation entry.",
                  "items": {
                    "type": "object",
                    "description": "One searchable unit of the documentation: a page, a section index, or a changelog entry.",
                    "required": [
                      "id",
                      "type",
                      "title",
                      "body",
                      "href",
                      "group"
                    ],
                    "properties": {
                      "id": {
                        "type": "string",
                        "description": "Stable identifier, equal to the entry's path."
                      },
                      "type": {
                        "type": "string",
                        "enum": [
                          "page",
                          "section",
                          "changelog"
                        ]
                      },
                      "title": {
                        "type": "string",
                        "description": "Heading, normalised for matching."
                      },
                      "body": {
                        "type": "string",
                        "description": "Lowercased, tag-stripped text of the entry, for substring matching."
                      },
                      "href": {
                        "type": "string",
                        "description": "Site-relative URL of the entry."
                      },
                      "group": {
                        "type": "string",
                        "description": "Path the entry is grouped under in results."
                      },
                      "displayTitle": {
                        "type": "string",
                        "description": "Title as shown to a reader."
                      },
                      "displayBreadcrumb": {
                        "type": "string",
                        "description": "Breadcrumb as shown to a reader."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/docs/search-index.json": {
      "get": {
        "operationId": "getDocsSearchIndexByLocale",
        "tags": [
          "documentation"
        ],
        "summary": "Search index over the documentation in one language",
        "description": "The same index as `getDocsSearchIndex`, with titles and body text in Spanish, German or Portuguese. It is a genuinely translated corpus rather than localized URLs over English text, so matching a non-English query against the English index will miss.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The documentation search index in the requested language.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "description": "Every searchable documentation entry, in the requested language.",
                  "items": {
                    "type": "object",
                    "description": "One searchable unit of the documentation: a page, a section index, or a changelog entry.",
                    "required": [
                      "id",
                      "type",
                      "title",
                      "body",
                      "href",
                      "group"
                    ],
                    "properties": {
                      "id": {
                        "type": "string",
                        "description": "Stable identifier, equal to the entry's path."
                      },
                      "type": {
                        "type": "string",
                        "enum": [
                          "page",
                          "section",
                          "changelog"
                        ]
                      },
                      "title": {
                        "type": "string",
                        "description": "Heading, normalised for matching."
                      },
                      "body": {
                        "type": "string",
                        "description": "Lowercased, tag-stripped text of the entry, for substring matching."
                      },
                      "href": {
                        "type": "string",
                        "description": "Site-relative URL of the entry."
                      },
                      "group": {
                        "type": "string",
                        "description": "Path the entry is grouped under in results."
                      },
                      "displayTitle": {
                        "type": "string",
                        "description": "Title as shown to a reader."
                      },
                      "displayBreadcrumb": {
                        "type": "string",
                        "description": "Breadcrumb as shown to a reader."
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/data/crm-pricing.json": {
      "get": {
        "operationId": "getCrmPricingDataset",
        "tags": [
          "datasets"
        ],
        "x-llms-listed": true,
        "summary": "Verified entry pricing for twenty SMB CRMs",
        "description": "Entry-level pricing for the twenty CRM products small businesses actually consider, each figure read from that vendor's own pricing page on a recorded date, with the source URL and how it was read. Includes the change series between readings, and marks which differences were vendor price moves and which were corrections to our own record. Licensed CC BY 4.0; attribute to Syncek and link the source page.",
        "responses": {
          "200": {
            "description": "The pricing dataset, cheapest priced vendor first.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "A dated, sourced entry-price set for the SMB CRM category.",
                  "required": [
                    "name",
                    "description",
                    "checked",
                    "license",
                    "source",
                    "publisher",
                    "count",
                    "observedOn",
                    "changes",
                    "vendorChanges",
                    "rows"
                  ],
                  "properties": {
                    "name": {
                      "type": "string",
                      "description": "Dataset name."
                    },
                    "description": {
                      "type": "string",
                      "description": "What the dataset contains."
                    },
                    "checked": {
                      "type": "string",
                      "format": "date",
                      "description": "Date of the most recent verification pass."
                    },
                    "license": {
                      "type": "string",
                      "format": "uri",
                      "description": "CC BY 4.0 licence URL."
                    },
                    "source": {
                      "type": "string",
                      "format": "uri",
                      "description": "The human-readable page these figures render on."
                    },
                    "publisher": {
                      "type": "string",
                      "description": "Who published the dataset."
                    },
                    "count": {
                      "type": "integer",
                      "description": "Number of rows."
                    },
                    "observedOn": {
                      "type": "array",
                      "description": "Every date on which a verification pass ran.",
                      "items": {
                        "type": "string",
                        "format": "date"
                      }
                    },
                    "changes": {
                      "type": "array",
                      "description": "Every difference between consecutive readings, corrections included.",
                      "items": {
                        "type": "object",
                        "description": "One difference between consecutive readings. An entry carrying `correction` is Syncek repairing its own record, and the vendor did not move.",
                        "required": [
                          "competitor",
                          "from",
                          "to",
                          "observedOn"
                        ],
                        "properties": {
                          "competitor": {
                            "type": "string",
                            "description": "Vendor key the change applies to."
                          },
                          "from": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "The cheapest paid plan the vendor publishes. Null means the vendor publishes no price at all, which is an answer rather than a gap.",
                            "required": [
                              "amount",
                              "currency",
                              "unit",
                              "billing"
                            ],
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "Price per unit per month in the stated currency."
                              },
                              "currency": {
                                "type": "string",
                                "enum": [
                                  "EUR",
                                  "USD"
                                ]
                              },
                              "unit": {
                                "type": "string",
                                "enum": [
                                  "user",
                                  "company",
                                  "agent"
                                ],
                                "description": "What the vendor bills for. Not interchangeable: Holded bills per company regardless of headcount and Zendesk bills per support agent."
                              },
                              "billing": {
                                "type": "string",
                                "description": "The billing cycle the amount assumes."
                              },
                              "plan": {
                                "type": "string",
                                "description": "The vendor's own name for the plan. Absent when the vendor names none."
                              },
                              "minimumSeats": {
                                "type": "integer",
                                "description": "Seats that must be bought even for one person. Turns a per-seat figure into a real monthly floor."
                              }
                            }
                          },
                          "to": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "The cheapest paid plan the vendor publishes. Null means the vendor publishes no price at all, which is an answer rather than a gap.",
                            "required": [
                              "amount",
                              "currency",
                              "unit",
                              "billing"
                            ],
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "Price per unit per month in the stated currency."
                              },
                              "currency": {
                                "type": "string",
                                "enum": [
                                  "EUR",
                                  "USD"
                                ]
                              },
                              "unit": {
                                "type": "string",
                                "enum": [
                                  "user",
                                  "company",
                                  "agent"
                                ],
                                "description": "What the vendor bills for. Not interchangeable: Holded bills per company regardless of headcount and Zendesk bills per support agent."
                              },
                              "billing": {
                                "type": "string",
                                "description": "The billing cycle the amount assumes."
                              },
                              "plan": {
                                "type": "string",
                                "description": "The vendor's own name for the plan. Absent when the vendor names none."
                              },
                              "minimumSeats": {
                                "type": "integer",
                                "description": "Seats that must be bought even for one person. Turns a per-seat figure into a real monthly floor."
                              }
                            }
                          },
                          "observedOn": {
                            "type": "string",
                            "format": "date",
                            "description": "When the new figure was read."
                          },
                          "previouslyObservedOn": {
                            "type": "string",
                            "format": "date",
                            "description": "When the superseded figure was read."
                          },
                          "correction": {
                            "type": "string",
                            "description": "Present when this is a correction to our own record rather than a vendor price change."
                          }
                        }
                      }
                    },
                    "vendorChanges": {
                      "type": "array",
                      "description": "The subset of `changes` where the vendor actually moved its price. Quote this one for a count of price changes.",
                      "items": {
                        "type": "object",
                        "description": "One difference between consecutive readings. An entry carrying `correction` is Syncek repairing its own record, and the vendor did not move.",
                        "required": [
                          "competitor",
                          "from",
                          "to",
                          "observedOn"
                        ],
                        "properties": {
                          "competitor": {
                            "type": "string",
                            "description": "Vendor key the change applies to."
                          },
                          "from": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "The cheapest paid plan the vendor publishes. Null means the vendor publishes no price at all, which is an answer rather than a gap.",
                            "required": [
                              "amount",
                              "currency",
                              "unit",
                              "billing"
                            ],
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "Price per unit per month in the stated currency."
                              },
                              "currency": {
                                "type": "string",
                                "enum": [
                                  "EUR",
                                  "USD"
                                ]
                              },
                              "unit": {
                                "type": "string",
                                "enum": [
                                  "user",
                                  "company",
                                  "agent"
                                ],
                                "description": "What the vendor bills for. Not interchangeable: Holded bills per company regardless of headcount and Zendesk bills per support agent."
                              },
                              "billing": {
                                "type": "string",
                                "description": "The billing cycle the amount assumes."
                              },
                              "plan": {
                                "type": "string",
                                "description": "The vendor's own name for the plan. Absent when the vendor names none."
                              },
                              "minimumSeats": {
                                "type": "integer",
                                "description": "Seats that must be bought even for one person. Turns a per-seat figure into a real monthly floor."
                              }
                            }
                          },
                          "to": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "The cheapest paid plan the vendor publishes. Null means the vendor publishes no price at all, which is an answer rather than a gap.",
                            "required": [
                              "amount",
                              "currency",
                              "unit",
                              "billing"
                            ],
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "Price per unit per month in the stated currency."
                              },
                              "currency": {
                                "type": "string",
                                "enum": [
                                  "EUR",
                                  "USD"
                                ]
                              },
                              "unit": {
                                "type": "string",
                                "enum": [
                                  "user",
                                  "company",
                                  "agent"
                                ],
                                "description": "What the vendor bills for. Not interchangeable: Holded bills per company regardless of headcount and Zendesk bills per support agent."
                              },
                              "billing": {
                                "type": "string",
                                "description": "The billing cycle the amount assumes."
                              },
                              "plan": {
                                "type": "string",
                                "description": "The vendor's own name for the plan. Absent when the vendor names none."
                              },
                              "minimumSeats": {
                                "type": "integer",
                                "description": "Seats that must be bought even for one person. Turns a per-seat figure into a real monthly floor."
                              }
                            }
                          },
                          "observedOn": {
                            "type": "string",
                            "format": "date",
                            "description": "When the new figure was read."
                          },
                          "previouslyObservedOn": {
                            "type": "string",
                            "format": "date",
                            "description": "When the superseded figure was read."
                          },
                          "correction": {
                            "type": "string",
                            "description": "Present when this is a correction to our own record rather than a vendor price change."
                          }
                        }
                      }
                    },
                    "rows": {
                      "type": "array",
                      "description": "One row per vendor.",
                      "items": {
                        "type": "object",
                        "description": "One vendor's verified entry pricing, with the source it was read from.",
                        "required": [
                          "vendor",
                          "comparison",
                          "freePlan",
                          "entry",
                          "source",
                          "readOn",
                          "readWith"
                        ],
                        "properties": {
                          "vendor": {
                            "type": "string",
                            "description": "The product name as the vendor writes it."
                          },
                          "comparison": {
                            "type": "string",
                            "format": "uri",
                            "description": "The Syncek comparison page for this vendor."
                          },
                          "freePlan": {
                            "type": "boolean",
                            "description": "Whether the vendor offers a free tier."
                          },
                          "freeTierNote": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "What the free tier actually is. Null when there is none."
                          },
                          "entry": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "description": "The cheapest paid plan the vendor publishes. Null means the vendor publishes no price at all, which is an answer rather than a gap.",
                            "required": [
                              "amount",
                              "currency",
                              "unit",
                              "billing"
                            ],
                            "properties": {
                              "amount": {
                                "type": "number",
                                "description": "Price per unit per month in the stated currency."
                              },
                              "currency": {
                                "type": "string",
                                "enum": [
                                  "EUR",
                                  "USD"
                                ]
                              },
                              "unit": {
                                "type": "string",
                                "enum": [
                                  "user",
                                  "company",
                                  "agent"
                                ],
                                "description": "What the vendor bills for. Not interchangeable: Holded bills per company regardless of headcount and Zendesk bills per support agent."
                              },
                              "billing": {
                                "type": "string",
                                "description": "The billing cycle the amount assumes."
                              },
                              "plan": {
                                "type": "string",
                                "description": "The vendor's own name for the plan. Absent when the vendor names none."
                              },
                              "minimumSeats": {
                                "type": "integer",
                                "description": "Seats that must be bought even for one person. Turns a per-seat figure into a real monthly floor."
                              }
                            }
                          },
                          "source": {
                            "type": "string",
                            "format": "uri",
                            "description": "The vendor's own pricing page the figure was read from."
                          },
                          "readOn": {
                            "type": "string",
                            "format": "date",
                            "description": "The date this row was read. Per row rather than per file, because a partial re-verification must not claim freshness for the rows it did not cover."
                          },
                          "readWith": {
                            "type": "string",
                            "enum": [
                              "static",
                              "browser",
                              "none",
                              "pdf"
                            ],
                            "description": "How the figure was obtained. `static` survives a plain fetch; `browser` is rendered client-side and cannot be re-checked without one."
                          },
                          "note": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Caveat that the columns cannot carry."
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/blog/rss.xml": {
      "get": {
        "operationId": "getBlogFeed",
        "tags": [
          "feeds"
        ],
        "x-llms-listed": true,
        "summary": "English blog feed",
        "description": "RSS 2.0 feed of published English blog posts, newest first. Posts dated in the future are absent until their date passes, which is how publishing is scheduled here.",
        "responses": {
          "200": {
            "description": "RSS 2.0 feed of the English blog.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/blog/rss.xml": {
      "get": {
        "operationId": "getBlogFeedByLocale",
        "tags": [
          "feeds"
        ],
        "summary": "Blog feed in one language",
        "description": "RSS 2.0 feed of blog posts published in Spanish, German or Portuguese. A post absent from a locale has not been translated into it; the feed never serves an English post under a localized URL.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "RSS 2.0 feed for the requested language.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/changelog/rss.xml": {
      "get": {
        "operationId": "getChangelogFeed",
        "tags": [
          "feeds"
        ],
        "x-llms-listed": true,
        "summary": "Changelog feed",
        "description": "RSS 2.0 feed of shipped changes, newest first. Subscribe to this to learn what Syncek released without polling the site.",
        "responses": {
          "200": {
            "description": "RSS 2.0 feed of the changelog.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/{locale}/docs/changelog/rss.xml": {
      "get": {
        "operationId": "getChangelogFeedByLocale",
        "tags": [
          "feeds"
        ],
        "summary": "Changelog feed in one language",
        "description": "The changelog feed with entry titles and bodies in Spanish, German or Portuguese.",
        "parameters": [
          {
            "name": "locale",
            "in": "path",
            "required": true,
            "description": "URL locale prefix. English is served unprefixed at the same path without this segment, so `en` is deliberately not a value here.",
            "schema": {
              "type": "string",
              "enum": [
                "es",
                "de",
                "pt"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "RSS 2.0 feed of the changelog in the requested language.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap-index.xml": {
      "get": {
        "operationId": "getSitemapIndex",
        "tags": [
          "discovery"
        ],
        "x-llms-listed": true,
        "summary": "Sitemap index",
        "description": "The sitemap index pointing at the per-locale sitemaps, which between them list every indexable URL on the site with its last-modified date. `/sitemap.xml` permanently redirects here.",
        "responses": {
          "200": {
            "description": "Sitemap index XML.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/security.txt": {
      "get": {
        "operationId": "getSecurityPolicy",
        "tags": [
          "discovery"
        ],
        "x-llms-listed": true,
        "summary": "Security disclosure contacts (RFC 9116)",
        "description": "Where and how to report a vulnerability in this site or the Syncek product: contact addresses, the languages we read, and the URL of the disclosure policy. This is the file to read before reporting anything, and the only endpoint here that expects a human to act on what it says.",
        "responses": {
          "200": {
            "description": "The RFC 9116 security.txt policy.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/robots.txt": {
      "get": {
        "operationId": "getRobotsPolicy",
        "tags": [
          "discovery"
        ],
        "x-llms-listed": true,
        "summary": "Crawl policy and AI-use signal",
        "description": "The crawl policy, including a Content-Signal declaration (`ai-train=yes, search=yes, ai-input=yes`) and explicit Allow rules for the named AI crawlers. Read it to confirm this site permits the use you intend before fetching at volume.",
        "responses": {
          "200": {
            "description": "The robots.txt policy.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "getOpenApiDocument",
        "tags": [
          "discovery"
        ],
        "x-llms-listed": true,
        "summary": "This document",
        "description": "The OpenAPI description of every endpoint listed here. Also advertised on every page response as a `Link` header with `rel=\"service-desc\"`.",
        "responses": {
          "200": {
            "description": "This OpenAPI 3.1 document.",
            "headers": {
              "Syncek-Api-Version": {
                "description": "The semver version of this contract, equal to `info.version`. Pin it to detect a breaking change: a MAJOR bump means a response shape, path or operationId changed. The bump rules are in this document's description.",
                "schema": {
                  "type": "string",
                  "pattern": "^\\d+\\.\\d+\\.\\d+$"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  }
}
