Write a page's structured data
https://seolyticize.com /api/v1/tools/generate_schema Reads one page of the client's site and writes the JSON-LD it should carry: a BreadcrumbList from its path; on the homepage an Organization (with an @id, the social profiles the page itself links to, and the logo from its Open Graph image) and a WebSite; a LocalBusiness from the client's saved location, as the subtype its vertical calls for (from the page's words, or localBusinessType; never the deprecated Attorney), with the address split into a PostalAddress, an @id, branchOf when the client has several locations, openingHoursSpecification from openingHours, areaServed for a service-area business, and never a self-serving aggregateRating; an Article for a post, with dates and author only where the page states them. Nothing is invented — a field the page does not state is left out and named in notes — and types the page already has are listed. Also Product (price, currency, availability and brand from the page's product tags, with OfferShippingDetails and MerchantReturnPolicy from shipping and returns), VideoObject for an embedded YouTube or Vimeo video (Clip per chapter the page lists, else SeekToAction; BroadcastEvent for a live stream), ProfilePage on an author or team page, QAPage on a question page, DiscussionForumPosting on a forum thread, an ItemList of a hub's own pages, SoftwareSourceCode for a page linking its repository, HowTo (its ordered list of steps; Google retired the rich result), Service (for /services/ pages), and on request (type) ProductGroup, FAQPage, SoftwareApplication, Organization, LocalBusiness or Article on any page. Every block is checked against Google's required and recommended properties for its type (validation), so it is clear whether it can earn a rich result as written. FAQPage is written only when asked for: Google stopped showing FAQ rich results for every site on 7 May 2026, and any benefit with assistants is unconfirmed; FAQPage and HowTo blocks carry richResultEligible: false with the reason. Answers 'what schema should this page have', 'write product schema for this page' and 'mark up our locations'. Free.
Parameters
Idempotency-KeystringheaderRequest body
application/json
clientIdstringrequiredurlstringrequiredtypestringlocalBusinessTypestringopeningHoursobject[]Show child parameters
daysstring[]requiredopensstringrequiredclosesstringrequiredareaServedstring[]shippingobjectShow child parameters
countrystringrequiredratenumberrequiredcurrencystringrequiredhandlingDaysobject[]requiredtransitDaysobject[]requiredreturnsobjectShow child parameters
countrystringrequireddaysintegerrequiredfeesstringmethodstring{
"clientId": "string",
"url": "string",
"type": null,
"localBusinessType": null,
"openingHours": [],
"areaServed": [],
"shipping": null,
"returns": null
}Code samples
cURL
curl -X POST "https://seolyticize.com/api/v1/tools/generate_schema" \
-H "Authorization: Bearer $SEOLYTICIZE_API_KEY" \
-H "Idempotency-Key: <value>" \
-H "Content-Type: application/json" \
-d '{"clientId":"string","url":"string","type":null,"localBusinessType":null,"openingHours":[],"areaServed":[],"shipping":null,"returns":null}'TypeScript
Python
Go
PHP
Ruby
Java
Responses
data, and its meta.Example
{
"data": {},
"meta": {
"requestId": "string",
"costMicros": 0,
"cached": true,
"cachedFrom": "string",
"dataAsOf": "string",
"sources": [
"string"
],
"partial": true,
"next": [
{
"tool": "string",
"args": {},
"why": "string"
}
],
"nextCursor": "string",
"dryRun": true
}
}Schema
datarequiredmetaobjectrequiredShow child parameters
requestIdstringrequiredcostMicrosintegerrequiredcachedbooleanrequiredcachedFromstringdataAsOfstringsourcesstring[]partialbooleanrequirednextobject[]requiredShow child parameters
toolstringargsobjectwhystringnextCursorstringdryRunbooleanX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerX-Request-IdstringExample
{
"error": "string",
"code": "string",
"next": "string",
"requestId": "string"
}Schema
errorstringrequiredcodestringnextstringrequestIdstringX-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/generate_schema
WWW-AuthenticatestringSame as 400 · POST /api/v1/tools/generate_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/generate_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/generate_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/generate_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerSame as 400 · POST /api/v1/tools/generate_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-ResetintegerRetry-AfterintegerSame as 400 · POST /api/v1/tools/generate_schema
X-RateLimit-LimitintegerX-RateLimit-RemainingintegerX-RateLimit-Resetinteger