Write a page's structured data

Embed
Preview of the card
<a href="https://seolyticize.com/docs/ref-generate-schema"><img src="https://seolyticize.com/docs/_api/public/orgs/71cb2b7a-a719-4003-b3ea-6321dc1db8ab/spaces/3bf2dbf7-3faa-473c-ba3b-30588f5f8de4/pages/0ecae7ea-eecc-4889-9374-a824c8a0f358/social-card.svg?v=3e7ae33eec8b" alt="Write a page's structured data" width="600" height="315"></a>
POSThttps://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-Keystringheader
Any unique string, up to 200 characters. A retry with the same key and body is answered from the first answer (Idempotent-Replayed: true) for a day, so it never buys or writes twice; the same key with another body is refused.

Request body

application/json
clientIdstringrequired
urlstringrequired
typestring
A type to write even where the page would not suggest it.
= null
localBusinessTypestring
The schema.org LocalBusiness subtype, e.g. Dentist or LegalService.
= null
openingHoursobject[]
As the Business Profile lists them, HH:MM.
= []
Show child parameters
daysstring[]required
opensstringrequired
closesstringrequired
areaServedstring[]
For a service-area business: the towns or regions it serves.
= []
shippingobject
The shop's shipping to one country, for Product offers.
= null
Show child parameters
countrystringrequired
ratenumberrequired
currencystringrequired
handlingDaysobject[]required
transitDaysobject[]required
returnsobject
The return policy: days null for no limit, 0 for no returns.
= null
Show child parameters
countrystringrequired
daysintegerrequired
feesstring
= null
methodstring
= null
{
  "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

200 The tool's result under 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
datarequired
metaobjectrequired
Beside every answer: what it cost, whether it came from cache, how fresh it is, whether it is complete, and what to call next.
Show child parameters
requestIdstringrequired
costMicrosintegerrequired
Charged by this call, micro-USD (1,000,000 = $1).
cachedbooleanrequired
True when nothing was bought.
cachedFromstring
When the oldest cached answer used was bought.
dataAsOfstring
sourcesstring[]
partialbooleanrequired
True when the data is incomplete: a running crawl, unfinished days, unread pages.
nextobject[]required
Show child parameters
toolstring
argsobject
whystring
nextCursorstring
Pass as cursor for the next page.
dryRunboolean
Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
X-Request-Idstring
The id to quote about this request.
400 The body was not JSON or did not match the tool's input schema.
Example
{
  "error": "string",
  "code": "string",
  "next": "string",
  "requestId": "string"
}
Schema
errorstringrequired
A sentence written for the caller. Internal failures are reduced to 'The request could not be completed.' and never carry detail.
codestring
A stable snake_case reason to branch on; GET /api/v1/errors lists them all.
nextstring
The call or step that fixes it, when there is one.
requestIdstring
Quote it when asking about a failure.
Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
401 No key, or a key that is unknown or revoked.

Same as 400 · POST /api/v1/tools/generate_schema

Headers
WWW-Authenticatestring
403 The key's role does not permit the tool, or the key may not reach the named client.

Same as 400 · POST /api/v1/tools/generate_schema

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
404 No tool by that name.

Same as 400 · POST /api/v1/tools/generate_schema

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
409 A request with this Idempotency-Key is still running.

Same as 400 · POST /api/v1/tools/generate_schema

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
422 A well-formed request the product declined, with the reason — a duplicate name, a plan limit, nothing configured to run.

Same as 400 · POST /api/v1/tools/generate_schema

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
429 This key has used its window.

Same as 400 · POST /api/v1/tools/generate_schema

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
Retry-Afterinteger
Seconds to wait before retrying.
500 The request could not be completed.

Same as 400 · POST /api/v1/tools/generate_schema

Headers
X-RateLimit-Limitinteger
Requests this key may make per window.
X-RateLimit-Remaininginteger
Requests left in the current window.
X-RateLimit-Resetinteger
Seconds until the current window resets.
Updated