Generate FAQ JSON-LD
Turn an approved list of questions and answers into clean schema.org FAQPage markup without writing nested JSON by hand.
Run — free
The generator validates every pair, preserves your chosen order, and returns both a structured object and a complete script block ready to place on the matching page. It does not invent claims or rewrite your copy, so the published structured data stays aligned with the answers your visitors can actually read. Browser use is convenient for one page, while the same deterministic operation can support repeatable publishing workflows.
Prepare visible questions and answers first
Start with the FAQ content that visitors can genuinely see on the page. Each row needs one complete question and its corresponding answer; neither may be blank or contain only whitespace. The generator deliberately does not compose, expand, or fact-check that material. This separation matters because structured data should represent the page, not create a second, hidden version of it. Review claims, policies, prices, dates, and eligibility rules with the people responsible for them before generating the block. Use plain, specific wording that makes sense without surrounding navigation or promotional copy. If two questions cover the same issue, resolve that duplication in the visible FAQ instead of expecting markup to choose between them. Arrange the pairs in the order you want retained. The resulting mainEntity list follows that sequence exactly, making reviews and source comparisons straightforward. After generation, keep the visible FAQ and its structured version synchronized whenever an answer changes; stale structured data can misrepresent even an otherwise accurate page.
Generate safe, standards-shaped markup
For every supplied pair, the generator creates a schema.org Question with the question stored as its name. It nests an Answer under acceptedAnswer and stores the supplied answer as text. Those records become the mainEntity array of a FAQPage object with the schema.org context. The response contains that object for software workflows and a formatted application/ld+json script block for direct placement in HTML. Whitespace around each submitted value is removed, while punctuation, capitalization, and internal formatting remain under your control. Serialization is deterministic: identical input produces identical output, with no network lookup, random value, model variation, or timestamp. Characters that could interfere with an HTML script element are encoded safely in the JSON text. That protection is important when user-authored answers contain angle brackets, ampersands, or a literal closing script fragment. The JSON still decodes to the original text, but pasting the returned block cannot prematurely close its own script element.
Publish, inspect, and maintain the result
Place the returned script block in the HTML of the page whose visible FAQ contains the same questions and answers. JSON-LD can normally sit in the document head or body, but your content management system may provide a dedicated structured-data field. Avoid adding the block to unrelated pages through a global template: the markup describes a specific page and should travel with that page's content. After publishing, inspect the rendered source or browser document to confirm that the application/ld+json element is present and has not been escaped as ordinary visible text. Then test the public page with the structured-data validation tools used by the search services you care about. Valid syntax does not promise a particular search appearance, and eligibility rules may change independently of schema.org structure. Treat the generated block as maintained content, not a one-time technical artifact. When an editor revises, removes, or reorders a visible answer, regenerate the JSON-LD from the new approved list and deploy both changes together.
What you can do with it
Publish a support FAQ
Convert reviewed help-centre questions into consistent FAQPage markup for the same public article.
Automate landing-page builds
Generate deterministic JSON-LD from FAQ records stored in a content system during each page build.
Replace hand-written schema
Remove fragile manual nesting and quoting from a publishing workflow while keeping editorial copy unchanged.
FAQ
What does the generator return?
It returns a schema object and a complete application/ld+json script block containing the same FAQPage data.
Does it write the questions or answers for me?
No. It only validates and structures the text you provide; it does not generate, rewrite, or verify claims.
What happens if a question or answer is empty?
The request fails with an invalid input error that identifies the empty question or answer by its position.
Is the script block safe to paste into HTML?
Yes. HTML-sensitive characters are escaped during JSON serialization so submitted text cannot close the script element early.
Does valid FAQPage markup guarantee a rich search result?
No. The generator creates valid schema structure, but search services decide eligibility and presentation under their own current policies.
How much does an API request cost?
Each API request costs $0.002. The browser tool can run the same deterministic logic locally.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/web/faq-schema-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pairs":[{"question":"How long does delivery take?","answer":"Standard delivery takes three to five business days."},{"question":"Can I change my order?","answer":"Yes. Contact support before the order is dispatched."}]}'const res = await fetch("https://api.kit.forhosting.com/web/faq-schema-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pairs": [
{
"question": "How long does delivery take?",
"answer": "Standard delivery takes three to five business days."
},
{
"question": "Can I change my order?",
"answer": "Yes. Contact support before the order is dispatched."
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/faq-schema-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pairs": [
{
"question": "How long does delivery take?",
"answer": "Standard delivery takes three to five business days."
},
{
"question": "Can I change my order?",
"answer": "Yes. Contact support before the order is dispatched."
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/faq-schema-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pairs":[{"question":"How long does delivery take?","answer":"Standard delivery takes three to five business days."},{"question":"Can I change my order?","answer":"Yes. Contact support before the order is dispatched."}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pairs":[{"question":"How long does delivery take?","answer":"Standard delivery takes three to five business days."},{"question":"Can I change my order?","answer":"Yes. Contact support before the order is dispatched."}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/faq-schema-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"pairs": [
{
"question": "How long does delivery take?",
"answer": "Standard delivery takes three to five business days."
},
{
"question": "Can I change my order?",
"answer": "Yes. Contact support before the order is dispatched."
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.faq_schema_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
timeout_sec | 30 |
max_crawl_pages | 25 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |