{
  "openapi": "3.1.0",
  "info": {
    "title": "Skribra API",
    "version": "1.0.0",
    "summary": "Public content API for skribra.com, plus the authenticated Skribra Content API.",
    "description": "Skribra is an automated SEO content engine: named AI agents research, write, illustrate and publish long-form articles to your CMS on a schedule, then keep the published ones ranking using your Google Search Console data.\n\nThis document describes two APIs:\n\n1. **The public content API** at `https://skribra.com/api/v1` — no authentication, no rate-limit key, CORS open to any origin. It exposes everything skribra.com publishes: the SEO glossary, the free tools, the agents, the product features, the competitor comparisons, pricing, and the blog. Use it to evaluate, cite or integrate with Skribra without signing up.\n2. **The Skribra Content API** at `https://api.skribra.com/v1` — a bearer key per account, used by customers to pull *their own* published articles into their own site. Documented in prose at https://skribra.com/docs/integrations/api.\n\nEvery page of skribra.com also has a markdown representation: send `Accept: text/markdown`, or append `.md` to the path.",
    "contact": {
      "name": "Skribra",
      "url": "https://skribra.com/developers",
      "email": "sev@skribra.com"
    },
    "license": {
      "name": "Proprietary",
      "url": "https://skribra.com/terms"
    },
    "termsOfService": "https://skribra.com/terms"
  },
  "servers": [
    {
      "url": "https://skribra.com/api/v1",
      "description": "Public content API — no authentication"
    }
  ],
  "externalDocs": {
    "description": "Skribra developer hub",
    "url": "https://skribra.com/developers"
  },
  "tags": [
    {
      "name": "Discovery",
      "description": "Index and health of the public API"
    },
    {
      "name": "Content",
      "description": "Pages, search and blog articles published on skribra.com"
    },
    {
      "name": "Glossary",
      "description": "The SEO and content marketing glossary"
    },
    {
      "name": "Product",
      "description": "Agents, features, comparisons, pricing and free tools"
    },
    {
      "name": "Content API (authenticated)",
      "description": "Pull your own published articles. Requires an account API key.",
      "externalDocs": {
        "url": "https://skribra.com/docs/integrations/api"
      }
    }
  ],
  "paths": {
    "/": {
      "get": {
        "tags": [
          "Discovery"
        ],
        "operationId": "getApiIndex",
        "summary": "API index",
        "description": "Every collection this API serves, with its URL — the entry point for an agent that has only the base URL.",
        "responses": {
          "200": {
            "description": "The index",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "version": {
                          "type": "string"
                        },
                        "documentation": {
                          "type": "string",
                          "format": "uri"
                        },
                        "openapi": {
                          "type": "string",
                          "format": "uri"
                        },
                        "llms_txt": {
                          "type": "string",
                          "format": "uri"
                        },
                        "endpoints": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "path": {
                                "type": "string"
                              },
                              "url": {
                                "type": "string",
                                "format": "uri"
                              },
                              "description": {
                                "type": "string"
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/health": {
      "get": {
        "tags": [
          "Discovery"
        ],
        "operationId": "getHealth",
        "summary": "Liveness check",
        "description": "Returns `ok` when the API is serving. Carries no authentication and no rate limit.",
        "responses": {
          "200": {
            "description": "Healthy",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "status"
                      ],
                      "properties": {
                        "status": {
                          "type": "string",
                          "enum": [
                            "ok"
                          ]
                        },
                        "time": {
                          "type": "string",
                          "format": "date-time"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/pages": {
      "get": {
        "tags": [
          "Content"
        ],
        "operationId": "listPages",
        "summary": "Every page on skribra.com",
        "description": "The full site index with a title, a one-line description, the HTML URL and the markdown URL for each page. Blog articles are listed by `/articles` instead, because there are hundreds of them.",
        "parameters": [
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Filter to one kind of page.",
            "schema": {
              "type": "string",
              "enum": [
                "page",
                "resource",
                "audience",
                "doc",
                "glossary",
                "glossary-category",
                "tool",
                "agent",
                "feature",
                "comparison"
              ]
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "1-based page number. Defaults to 1.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page. Defaults to 50, capped at 200.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of site pages",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Page"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/search": {
      "get": {
        "tags": [
          "Content"
        ],
        "operationId": "search",
        "summary": "Search this site's content",
        "description": "Case-insensitive token search across page titles and descriptions — glossary terms, tools, agents, features, comparisons and static pages. Blog article bodies are not indexed here; use `/articles`.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "The query. Every whitespace-separated token must appear in the title or description.",
            "schema": {
              "type": "string",
              "minLength": 2
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum results. Defaults to 20, capped at 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching pages, best match first",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "query",
                        "total"
                      ],
                      "properties": {
                        "query": {
                          "type": "string"
                        },
                        "total": {
                          "type": "integer"
                        },
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/SearchResult"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/glossary": {
      "get": {
        "tags": [
          "Glossary"
        ],
        "operationId": "listGlossaryTerms",
        "summary": "List glossary terms",
        "description": "Definitions, key points and sources for SEO, content marketing and AI terms.",
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Filter by category slug. See `/glossary/categories`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filter by substring of the term title or definition.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "full",
            "in": "query",
            "required": false,
            "description": "Include `sections`, `key_points` and `sources` on every item. Off by default — the list is large.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "1-based page number. Defaults to 1.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page. Defaults to 50, capped at 200.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of glossary terms",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/GlossaryTerm"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/glossary/categories": {
      "get": {
        "tags": [
          "Glossary"
        ],
        "operationId": "listGlossaryCategories",
        "summary": "List glossary categories",
        "responses": {
          "200": {
            "description": "Every glossary category, with its term count",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/GlossaryCategory"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/glossary/{slug}": {
      "get": {
        "tags": [
          "Glossary"
        ],
        "operationId": "getGlossaryTerm",
        "summary": "Get one glossary term",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "The term's slug, e.g. `backlink`.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The term, with every section and source",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/GlossaryTerm"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/tools": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "listTools",
        "summary": "List the free SEO and writing tools",
        "description": "The free tools published on skribra.com. Most run in the visitor's browser; the data-backed ones run on Skribra's servers and are reachable only from the site itself.",
        "responses": {
          "200": {
            "description": "Every free tool",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Tool"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/{slug}": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "getTool",
        "summary": "Get one free tool",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The tool, with its explanation and FAQ",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Tool"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/agents": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "listAgents",
        "summary": "List the Skribra agents",
        "description": "The named agents that write and maintain content, with the signal each one watches.",
        "responses": {
          "200": {
            "description": "Every agent",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Agent"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/agents/{slug}": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "getAgent",
        "summary": "Get one agent",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The agent, with how it works step by step",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Agent"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/features": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "listFeatures",
        "summary": "List product features",
        "responses": {
          "200": {
            "description": "Every feature",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Feature"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/features/{slug}": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "getFeature",
        "summary": "Get one feature",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The feature, with its FAQ and related agents",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Feature"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/comparisons": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "listComparisons",
        "summary": "List competitor comparisons",
        "responses": {
          "200": {
            "description": "Every published comparison",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ComparisonSummary"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/comparisons/{slug}": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "getComparison",
        "summary": "Get one comparison",
        "description": "The full feature matrix, where each side wins, and the dated pricing note behind the numbers.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The comparison",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Comparison"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/pricing": {
      "get": {
        "tags": [
          "Product"
        ],
        "operationId": "getPricing",
        "summary": "Get plans and prices",
        "description": "The same plans, prices and limits the pricing section renders. USD.",
        "responses": {
          "200": {
            "description": "Plans, the one-off BYOK option and the terms",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Pricing"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/articles": {
      "get": {
        "tags": [
          "Content"
        ],
        "operationId": "listArticles",
        "summary": "List Skribra's own blog articles",
        "description": "The articles published on skribra.com/blog — written and published by Skribra itself. Unpublished, redirected and editorially retired articles are filtered out.",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "1-based page number. Defaults to 1.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page. Defaults to 50, capped at 200.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filter by substring of the title.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of articles",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ArticleSummary"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/articles/{slug}": {
      "get": {
        "tags": [
          "Content"
        ],
        "operationId": "getArticle",
        "summary": "Get one blog article",
        "description": "The full article. `content_markdown` is the body converted from the published HTML.",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "required": false,
            "description": "`markdown` (default) returns `content_markdown`; `html` returns `content_html`; `both` returns both.",
            "schema": {
              "type": "string",
              "enum": [
                "markdown",
                "html",
                "both"
              ],
              "default": "markdown"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The article",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Article"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/projects": {
      "servers": [
        {
          "url": "https://api.skribra.com",
          "description": "Skribra Content API — authenticated, for customers publishing their own articles"
        }
      ],
      "get": {
        "tags": [
          "Content API (authenticated)"
        ],
        "operationId": "listOwnProjects",
        "summary": "List your projects",
        "description": "Start here: this is how you find the `projectId` every other Content API call needs. Projects with the API switched off are listed too, with `api_enabled: false`.",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "responses": {
          "200": {
            "description": "Your projects",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/OwnProject"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/articles": {
      "servers": [
        {
          "url": "https://api.skribra.com",
          "description": "Skribra Content API — authenticated, for customers publishing their own articles"
        }
      ],
      "get": {
        "tags": [
          "Content API (authenticated)"
        ],
        "operationId": "listOwnArticles",
        "summary": "List your published articles",
        "description": "A page of published articles without the body. Unpublished articles, and any Curator has redirected away during consolidation, are filtered out server-side.",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "parameters": [
          {
            "name": "projectId",
            "in": "query",
            "required": true,
            "description": "Which project to read. Get it from `GET /v1/projects`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Defaults to 20, capped at 100.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "updatedSince",
            "in": "query",
            "required": false,
            "description": "Only articles created or edited since this moment.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "published_at",
                "updated_at",
                "title"
              ],
              "default": "published_at"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "desc",
                "asc"
              ],
              "default": "desc"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A page of your published articles",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "type": "object",
                      "required": [
                        "items",
                        "pagination"
                      ],
                      "properties": {
                        "items": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ArticleSummary"
                          }
                        },
                        "pagination": {
                          "$ref": "#/components/schemas/Pagination"
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/articles/{slug}": {
      "servers": [
        {
          "url": "https://api.skribra.com",
          "description": "Skribra Content API — authenticated, for customers publishing their own articles"
        }
      ],
      "get": {
        "tags": [
          "Content API (authenticated)"
        ],
        "operationId": "getOwnArticle",
        "summary": "Get one of your articles",
        "description": "The full article. `content_html` is the body alone — the table of contents, related articles and JSON-LD come back beside it as `toc_html`, `related_articles` and `json_ld`, so each can be placed where your layout wants it.",
        "security": [
          {
            "bearerAuth": []
          },
          {
            "apiKeyHeader": []
          }
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "projectId",
            "in": "query",
            "required": true,
            "description": "Required: slugs are unique within a project, not across an account.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The article",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Article"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "An account API key generated under Integrations → Skribra API in the dashboard, sent as `Authorization: Bearer skr_live_…`. Server-side only: it reads every enabled project on the account."
      },
      "apiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Api-Key",
        "description": "The same account API key, for runtimes where `Authorization` is awkward."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "description": "Every rejection carries a stable `code` to branch on and a `message` to show.",
        "properties": {
          "code": {
            "type": "string",
            "description": "Stable machine-readable reason.",
            "examples": [
              "invalid_query",
              "not_found",
              "unauthorized",
              "project_api_disabled",
              "project_not_found",
              "rate_limited",
              "upstream_unavailable"
            ]
          },
          "message": {
            "type": "string"
          }
        }
      },
      "Pagination": {
        "type": "object",
        "required": [
          "page",
          "limit",
          "total",
          "total_pages",
          "has_more"
        ],
        "properties": {
          "page": {
            "type": "integer"
          },
          "limit": {
            "type": "integer"
          },
          "total": {
            "type": "integer"
          },
          "total_pages": {
            "type": "integer"
          },
          "has_more": {
            "type": "boolean"
          }
        }
      },
      "Page": {
        "type": "object",
        "required": [
          "path",
          "title",
          "description",
          "kind",
          "url",
          "markdown_url"
        ],
        "properties": {
          "path": {
            "type": "string",
            "examples": [
              "/glossary/backlink"
            ]
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "section": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdown_url": {
            "type": "string",
            "format": "uri",
            "description": "The same page as `text/markdown`."
          },
          "updated": {
            "type": "string",
            "format": "date"
          }
        }
      },
      "SearchResult": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Page"
          },
          {
            "type": "object",
            "properties": {
              "score": {
                "type": "number",
                "description": "Higher is a better match. Title hits outrank description hits."
              }
            }
          }
        ]
      },
      "GlossaryCategory": {
        "type": "object",
        "required": [
          "slug",
          "label",
          "description"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "term_count": {
            "type": "integer"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "GlossaryTerm": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "definition",
          "category",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "definition": {
            "type": "string",
            "description": "One sentence."
          },
          "tldr": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "key_points": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sections": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "heading": {
                  "type": "string"
                },
                "content": {
                  "type": "string",
                  "description": "Markdown. Cross-references are resolved to absolute links."
                }
              }
            }
          },
          "related_terms": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              }
            }
          },
          "updated": {
            "type": "string",
            "format": "date"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdown_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Tool": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "description",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "popular": {
            "type": "boolean"
          },
          "runs_on": {
            "type": "string",
            "enum": [
              "browser",
              "server"
            ],
            "description": "`server` tools call Skribra and are reachable only from skribra.com itself."
          },
          "faqs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "question": {
                  "type": "string"
                },
                "answer": {
                  "type": "string"
                }
              }
            }
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdown_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Agent": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "tagline",
          "kind",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "tagline": {
            "type": "string"
          },
          "one_liner": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "autonomous",
              "recommend"
            ],
            "description": "`recommend` agents propose and wait for approval."
          },
          "signal": {
            "type": "string",
            "description": "What it watches."
          },
          "action": {
            "type": "string",
            "description": "What it does when the signal fires."
          },
          "cadence": {
            "type": "string"
          },
          "how": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "step": {
                  "type": "string"
                },
                "detail": {
                  "type": "string"
                }
              }
            }
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdown_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Feature": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "tagline",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "category": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "tagline": {
            "type": "string"
          },
          "intro": {
            "type": "string"
          },
          "problem": {
            "type": "string"
          },
          "benefits": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "how": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string"
                },
                "body": {
                  "type": "string"
                }
              }
            }
          },
          "faqs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "question": {
                  "type": "string"
                },
                "answer": {
                  "type": "string"
                }
              }
            }
          },
          "related_features": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "related_agents": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdown_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "ComparisonSummary": {
        "type": "object",
        "required": [
          "slug",
          "competitor",
          "title",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string"
          },
          "competitor": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdown_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Comparison": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ComparisonSummary"
          },
          {
            "type": "object",
            "properties": {
              "intro": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "pricing_note": {
                "type": "string",
                "description": "When the competitor's numbers were last verified."
              },
              "feature_matrix": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "feature": {
                      "type": "string"
                    },
                    "skribra": {
                      "description": "`true`, `false`, `\"soon\"`, or a string."
                    },
                    "competitor": {
                      "description": "`true`, `false`, `\"soon\"`, or a string."
                    }
                  }
                }
              },
              "skribra_wins": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "competitor_wins": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "faqs": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "question": {
                      "type": "string"
                    },
                    "answer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "Pricing": {
        "type": "object",
        "required": [
          "currency",
          "plans"
        ],
        "properties": {
          "currency": {
            "type": "string",
            "examples": [
              "USD"
            ]
          },
          "terms": {
            "type": "string"
          },
          "plans": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "monthly_usd": {
                  "type": "number"
                },
                "annual_usd_per_month": {
                  "type": "number"
                },
                "articles_per_month": {
                  "type": "string"
                },
                "cadence": {
                  "type": "string"
                },
                "tagline": {
                  "type": "string"
                },
                "features": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "featured": {
                  "type": "boolean"
                }
              }
            }
          },
          "byok": {
            "type": "object",
            "description": "Bring Your Own Key — a one-off payment, limited seats.",
            "properties": {
              "price_usd": {
                "type": "number"
              },
              "summary": {
                "type": "string"
              },
              "features": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "ArticleSummary": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "slug": {
            "type": "string"
          },
          "excerpt": {
            "type": "string"
          },
          "image_url": {
            "type": "string",
            "format": "uri"
          },
          "type": {
            "type": "string",
            "examples": [
              "Guide"
            ]
          },
          "reading_time": {
            "type": "integer",
            "description": "Minutes."
          },
          "published_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "markdown_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Article": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ArticleSummary"
          },
          {
            "type": "object",
            "properties": {
              "content_markdown": {
                "type": "string",
                "description": "The body as markdown."
              },
              "content_html": {
                "type": "string",
                "description": "The body as published HTML."
              },
              "toc_html": {
                "type": "string"
              },
              "json_ld": {
                "type": "array",
                "items": {
                  "type": "object"
                }
              },
              "related_articles": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    }
                  }
                }
              },
              "sources": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "domain": {
                      "type": "string"
                    },
                    "title": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "OwnProject": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "api_enabled": {
            "type": "boolean",
            "description": "False means requests for this project return `403 project_api_disabled`."
          }
        }
      }
    }
  }
}
