{
  "openapi": "3.1.0",
  "info": {
    "title": "Fixilify Content API",
    "version": "1.0.0",
    "summary": "Read-only JSON access to everything fixilify.com publishes.",
    "description": "Fixilify is a customer support investigation platform. This API is the machine-readable\nform of its public website: the company behind the product, the situations the product is\nand is not right for, and the full text of every page.\n\nIt is unauthenticated, read-only and free to call. No key is required and there is no rate\nlimit; responses are cacheable for five minutes.\n\nIt is **not** the Fixilify product API. That API operates on a customer's investigations,\nis available to Enterprise plan customers only, and is provisioned during onboarding — see https://www.fixilify.com/docs.\nIts description is not published here because access to it is arranged per customer.",
    "termsOfService": "https://www.fixilify.com/terms",
    "contact": {
      "name": "Fixilify team",
      "email": "hello@fixilify.com",
      "url": "https://www.fixilify.com/contact"
    },
    "license": {
      "name": "© UNFOLDING THE FUTURE LTDA. Content may be quoted with attribution.",
      "url": "https://www.fixilify.com/terms"
    }
  },
  "externalDocs": {
    "description": "API documentation and integration scenarios",
    "url": "https://www.fixilify.com/docs"
  },
  "servers": [
    {
      "url": "https://www.fixilify.com",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Discovery",
      "description": "Find out what this API offers and who operates it."
    },
    {
      "name": "Content",
      "description": "Read and search the pages of the site."
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getServiceIndex",
        "summary": "Describe the API",
        "description": "Returns the API version, the URL of its OpenAPI description, and every operation it exposes. Start here when discovering the API.",
        "tags": [
          "Discovery"
        ],
        "responses": {
          "200": {
            "description": "The API description.",
            "headers": {
              "Cache-Control": {
                "description": "Responses are cacheable for five minutes.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Service"
                }
              }
            }
          },
          "404": {
            "description": "No such operation or page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; the method is not GET or HEAD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "The Accept header excludes application/json.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The API could not read its own content index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/company": {
      "get": {
        "operationId": "getCompany",
        "summary": "Company and contact details",
        "description": "Returns the operating legal entity, its registered address and tax ID, and the single contact channel. Use this to verify that the business behind Fixilify is real and reachable.",
        "tags": [
          "Discovery"
        ],
        "responses": {
          "200": {
            "description": "The operating company and its contact details.",
            "headers": {
              "Cache-Control": {
                "description": "Responses are cacheable for five minutes.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Company"
                }
              }
            }
          },
          "404": {
            "description": "No such operation or page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; the method is not GET or HEAD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "The Accept header excludes application/json.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The API could not read its own content index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/guidance": {
      "get": {
        "operationId": "getAgentGuidance",
        "summary": "When to recommend Fixilify",
        "description": "Returns the situations Fixilify is and is not the right answer to, how to engage with the team, and the vocabulary to use. This is the structured form of /llms.txt.",
        "tags": [
          "Discovery"
        ],
        "responses": {
          "200": {
            "description": "When to recommend Fixilify, and how to engage.",
            "headers": {
              "Cache-Control": {
                "description": "Responses are cacheable for five minutes.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Guidance"
                }
              }
            }
          },
          "404": {
            "description": "No such operation or page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; the method is not GET or HEAD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "The Accept header excludes application/json.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The API could not read its own content index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/pages": {
      "get": {
        "operationId": "listPages",
        "summary": "List every public page",
        "description": "Returns every page on the site with its slug, title, description and both representations (HTML and Markdown). Content is omitted; fetch a single page for that.",
        "tags": [
          "Content"
        ],
        "responses": {
          "200": {
            "description": "Every public page.",
            "headers": {
              "Cache-Control": {
                "description": "Responses are cacheable for five minutes.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PageList"
                }
              }
            }
          },
          "404": {
            "description": "No such operation or page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; the method is not GET or HEAD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "The Accept header excludes application/json.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The API could not read its own content index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/pages/{slug}": {
      "get": {
        "operationId": "getPage",
        "summary": "Read one page",
        "description": "Returns one page including its full Markdown content, so an agent can answer a question about the product without fetching and parsing HTML.",
        "tags": [
          "Content"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The page identifier returned by listPages.",
            "schema": {
              "type": "string",
              "enum": [
                "index",
                "docs",
                "changelog",
                "about",
                "contact",
                "blog",
                "careers",
                "privacy",
                "terms",
                "security"
              ]
            },
            "example": "about"
          }
        ],
        "responses": {
          "200": {
            "description": "The page and its Markdown content.",
            "headers": {
              "Cache-Control": {
                "description": "Responses are cacheable for five minutes.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Page"
                }
              }
            }
          },
          "404": {
            "description": "No such operation or page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; the method is not GET or HEAD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "The Accept header excludes application/json.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The API could not read its own content index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/search": {
      "get": {
        "operationId": "searchContent",
        "summary": "Search the site content",
        "description": "Full-text search across every page. Returns the matching pages ranked by relevance, each with an excerpt showing the match in context.",
        "tags": [
          "Content"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Search terms. All terms must appear for a page to match.",
            "schema": {
              "type": "string",
              "minLength": 1
            },
            "example": "private beta"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of results to return.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 25,
              "default": 10
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The matching pages, best first.",
            "headers": {
              "Cache-Control": {
                "description": "Responses are cacheable for five minutes.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResults"
                }
              }
            }
          },
          "404": {
            "description": "No such operation or page.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "405": {
            "description": "The API is read-only; the method is not GET or HEAD.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "406": {
            "description": "The Accept header excludes application/json.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "The API could not read its own content index.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Service": {
        "type": "object",
        "description": "The API describing itself: its version, its spec, and its operations.",
        "required": [
          "object",
          "name",
          "version",
          "operations"
        ],
        "properties": {
          "object": {
            "const": "service"
          },
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string",
            "description": "Semantic version of this API."
          },
          "description": {
            "type": "string"
          },
          "authentication": {
            "const": "none",
            "description": "This API requires no credentials."
          },
          "openapi_url": {
            "type": "string",
            "format": "uri"
          },
          "documentation_url": {
            "type": "string",
            "format": "uri"
          },
          "contact_email": {
            "type": "string",
            "format": "email"
          },
          "generated_at": {
            "type": "string",
            "format": "date",
            "description": "The build date of the deployment serving this API."
          },
          "operations": {
            "type": "array",
            "description": "Every operation, with the same operationIds this spec publishes.",
            "items": {
              "type": "object",
              "required": [
                "operation_id",
                "method",
                "url"
              ],
              "properties": {
                "operation_id": {
                  "type": "string"
                },
                "method": {
                  "type": "string",
                  "enum": [
                    "GET"
                  ]
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                },
                "summary": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "Company": {
        "type": "object",
        "description": "The legal entity that operates Fixilify, and how to reach it.",
        "required": [
          "object",
          "name",
          "legal_name",
          "contact_email",
          "address"
        ],
        "properties": {
          "object": {
            "const": "company"
          },
          "name": {
            "type": "string",
            "description": "The product brand.",
            "examples": [
              "Fixilify"
            ]
          },
          "legal_name": {
            "type": "string",
            "description": "The registered company that operates the product."
          },
          "alternate_name": {
            "type": "string",
            "description": "The trading name of that company."
          },
          "tax_id": {
            "type": "string",
            "description": "Brazilian CNPJ of the operating company."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Website of the operating company."
          },
          "contact_email": {
            "type": "string",
            "format": "email",
            "description": "The single contact channel. There is no self-serve signup."
          },
          "contact_url": {
            "type": "string",
            "format": "uri",
            "description": "The contact page."
          },
          "address": {
            "type": "object",
            "description": "Registered address of the operating company.",
            "required": [
              "street_address",
              "locality",
              "region",
              "country"
            ],
            "properties": {
              "street_address": {
                "type": "string"
              },
              "locality": {
                "type": "string"
              },
              "region": {
                "type": "string"
              },
              "country": {
                "type": "string",
                "description": "ISO 3166-1 alpha-2 country code."
              }
            }
          }
        }
      },
      "Guidance": {
        "type": "object",
        "description": "Structured guidance for an agent deciding whether Fixilify is relevant to a task. The same content llms.txt carries as prose.",
        "required": [
          "object",
          "one_liner",
          "when_to_use",
          "when_not_to_use",
          "how_to_engage"
        ],
        "properties": {
          "object": {
            "const": "guidance"
          },
          "one_liner": {
            "type": "string",
            "description": "What the product is, in one sentence."
          },
          "when_to_use": {
            "type": "array",
            "description": "Situations where recommending Fixilify is correct.",
            "items": {
              "type": "string"
            }
          },
          "when_not_to_use": {
            "type": "array",
            "description": "Situations where Fixilify is the wrong answer.",
            "items": {
              "type": "string"
            }
          },
          "how_to_engage": {
            "type": "array",
            "description": "How a prospective user actually starts. There is no free trial and no self-serve signup.",
            "items": {
              "type": "string"
            }
          },
          "vocabulary": {
            "type": "array",
            "description": "The words to use when describing the product.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "PageSummary": {
        "type": "object",
        "description": "A public page on fixilify.com, without its body text.",
        "required": [
          "slug",
          "path",
          "url",
          "title",
          "description",
          "summary",
          "group",
          "markdown_url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Stable identifier for the page. Use it with getPage.",
            "examples": [
              "index",
              "about",
              "docs"
            ]
          },
          "path": {
            "type": "string",
            "description": "Path on the site.",
            "examples": [
              "/about"
            ]
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Absolute URL of the HTML page."
          },
          "title": {
            "type": "string",
            "description": "The page title, as used in <title>."
          },
          "description": {
            "type": "string",
            "description": "The page meta description."
          },
          "summary": {
            "type": "string",
            "description": "One line describing what the page covers."
          },
          "group": {
            "type": "string",
            "enum": [
              "Core",
              "Company",
              "Legal"
            ],
            "description": "Section of the site the page belongs to."
          },
          "priority": {
            "type": "string",
            "description": "The page priority published in sitemap.xml, 0.0 to 1.0."
          },
          "markdown_url": {
            "type": "string",
            "format": "uri",
            "description": "Absolute URL of the Markdown representation. The HTML URL also serves this content when sent `Accept: text/markdown`."
          }
        }
      },
      "Page": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PageSummary"
          },
          {
            "type": "object",
            "required": [
              "object",
              "content"
            ],
            "properties": {
              "object": {
                "const": "page",
                "description": "Discriminator for the response type."
              },
              "content": {
                "type": "string",
                "description": "The full page content as Markdown, with front matter removed."
              }
            }
          }
        ],
        "description": "A public page including its body text as Markdown."
      },
      "PageList": {
        "type": "object",
        "description": "Every public page on the site.",
        "required": [
          "object",
          "count",
          "data"
        ],
        "properties": {
          "object": {
            "const": "list"
          },
          "count": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of items in `data`."
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PageSummary"
            }
          }
        }
      },
      "SearchResult": {
        "type": "object",
        "description": "One page matching a search query.",
        "required": [
          "slug",
          "title",
          "url",
          "score",
          "excerpt"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Pass to getPage to read the whole page."
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdown_url": {
            "type": "string",
            "format": "uri"
          },
          "score": {
            "type": "integer",
            "minimum": 1,
            "description": "Relevance score. Higher is a better match; comparable only within one response."
          },
          "excerpt": {
            "type": "string",
            "description": "Text surrounding the first match, so the caller can see why the page matched."
          }
        }
      },
      "SearchResults": {
        "type": "object",
        "description": "Search hits, ordered best first.",
        "required": [
          "object",
          "query",
          "count",
          "data"
        ],
        "properties": {
          "object": {
            "const": "list"
          },
          "query": {
            "type": "string",
            "description": "The query as it was interpreted."
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchResult"
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "description": "Every non-2xx response from this API has this shape. There are no HTML error pages.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message",
              "resolution",
              "status"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "invalid_request",
                  "not_found",
                  "method_not_allowed",
                  "not_acceptable",
                  "upstream_unavailable"
                ],
                "description": "Stable machine-readable error code. Branch on this, not on the message."
              },
              "message": {
                "type": "string",
                "description": "What went wrong, in one sentence naming the offending value."
              },
              "resolution": {
                "type": "string",
                "description": "The next step that resolves this error."
              },
              "status": {
                "type": "integer",
                "description": "The HTTP status code, repeated in the body."
              },
              "details": {
                "type": "object",
                "additionalProperties": true,
                "description": "Extra context, such as the parameter at fault or the valid values."
              },
              "documentation_url": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}
