# FAQ schema generator

> Paste a draft or type your questions and get FAQPage JSON-LD, with the warnings that matter. Free, no sign-up, and it runs in your browser.

Paste a Markdown draft with an FAQ section, or type the pairs by hand. The generator reads the questions and their answers and writes the FAQPage JSON-LD. Copy the script tag into the page that shows those answers.

Page: https://seodraft.app/tools/faq-schema-generator

## Run it from your agent

The check on this page is also a JSON endpoint and a tool on a public MCP server. Neither needs an account or a key.

### JSON endpoint

```http
POST https://seodraft.app/api/tools/faq-schema-generator
content-type: application/json

{
  "markdown": "## FAQ\n\n### Does seodraft publish the article?\n\nNo. It writes a draft into your repository and you publish from your CMS.\n\n### How many questions does a page need?\n\nThe ones it answers, from two up.\n",
  "pageUrl": "https://example.com/blog/faq-schema"
}
```

Limits: 20 calls per minute per IP. Over a limit the answer is 429 with Retry-After.

### Free MCP server

Add this URL to Claude, ChatGPT, Cursor or any MCP client. It exposes every free tool, with no sign-in.

- URL: https://seodraft.app/tools/mcp
- Tool: `generate_faq_schema`

Builds FAQPage JSON-LD from a Markdown draft or from a list of question and answer pairs. Send markdown, faqs, or both; an explicit faqs list is used instead of detection. In Markdown it reads an FAQ section first (a heading named FAQ, Frequently asked questions, Questions, Preguntas frecuentes and the like), where the child headings are the questions and the text up to the next heading of the same level or higher is the answer; with no such section, every heading that ends in a question mark is a question. Answers come back as plain text (links keep their words, images, code fences, HTML tags and emphasis markers are removed), capped at 50 questions and 2000 characters per answer. Returns faqs (the pairs the markup carries), jsonLd (@graph with FAQPage, plus BlogPosting when article is given), script (the whole <script type="application/ld+json"> block with < escaped as \u003c) and warnings, each with a code and a severity: no-questions and too-few-questions (under two) describe the set; empty-answer and duplicate-question name entries that were left out; question-not-question, answer-has-html and faq-rich-results-restricted are info. Nothing is fetched: pageUrl is only written into @id and url.

## What FAQPage markup does

FAQPage markup names the questions a page answers and the answer under each one, in JSON that a machine reads without parsing your layout.

Google narrowed the rich result in August 2023. The expandable questions under a listing now show for well-known government and health sites. The markup keeps describing the page to search engines and to the assistants that quote pages in their answers.

The rule that still holds is visibility: every question and answer in the markup has to be on the page a reader lands on.

## How this generator reads your draft

It looks for an FAQ section first. A heading named FAQ, Frequently asked questions, Questions or Preguntas frecuentes opens the block; the headings under it are the questions, and the text up to the next heading of the same level is the answer.

With no FAQ section in the draft, any heading that ends in a question mark becomes a question and the paragraphs under it become its answer.

Markdown comes out as plain text. A link keeps its words and loses its URL; images, code fences and emphasis markers go.

Typing the pairs by hand overrides detection, which is the way to mark up a page whose draft you do not have.

## What each warning means

no-questions says the draft gave nothing to mark up, usually because the FAQ headings are bold paragraphs instead of headings.

too-few-questions counts a single pair. empty-answer and duplicate-question name entries that were left out of the JSON, because an answer with no text and a question asked twice both make the markup disagree with the page.

question-not-question flags a name that reads as a topic, such as "Pricing". The name of a Question is the phrase a person types, so write it that way.

answer-has-html reports the tags that were stripped. faq-rich-results-restricted repeats what Google changed in 2023, so nobody ships this markup expecting stars.

## What the generator leaves to you

It reads the text you paste and nothing else. The page URL is written into @id and url; no page is fetched.

It takes up to 50 questions and cuts an answer at 2000 characters, on a word.

Paste the tag into the head or the body of the page that shows those answers, then run the URL through Google's Rich Results Test to see the markup the way Google parses it.

## Questions

### Does FAQ schema still get rich results?

Well-known government and health sites get them. Google restricted the FAQ rich result in August 2023, and the markup went back to what it always was underneath: a description of the page that search engines and answer engines read.

### How many questions should the markup carry?

The ones the page answers, from two up. Below two, an FAQPage describes a single exchange and the page usually has more to say. The seodraft rules ask a draft for three.

### Can an answer hold links or HTML?

Google's FAQPage documentation accepts a few HTML tags inside an answer. This generator strips them and writes plain text, which keeps the JSON valid however the draft was formatted. The links stay in the page body, where a reader clicks them.

### Where does the script tag go?

Anywhere in the page that shows those questions, head or body. What matters is the page: a reader who lands on it has to see the same questions and answers.

### Does my draft leave the browser?

No. The generator on this page runs in your browser and sends nothing. The JSON endpoint next to it is there for agents, and it writes nothing down.

## The full process runs in seodraft

In seodraft the FAQs are a field of the draft, not an afterthought at the end: the rules ask for three before an article can be approved, and the Markdown delivered to your repository carries them for the site to render.

MCP: https://seodraft.app/mcp
